Disable Blinking Cursor in iOS UITextField

(c) 2012 kevin languedoc (klanguedoc)

This solution will allow an UIDatePicker to update an UItextField while having no blinking cursors in the UITextField in an iPhone app. When a user clicks on the UITextField, a UIDatePicker will display on screen to allow a user to select a date. The UITextField will get updated while never having a cursor blink the field.

Project Setup & Storyboard

For this simple project, I chose a Single View Controller. Once the project is created, open the storyboard and add a UITextField and select the Attributes inspector and disable the field by unselecting the “enabled” attribute.

Next open the corresponding view controller header file by selecting the Assistant editor and Ctlr+drag a connection from the UITextField to the open header file, between the @interface and @end directives. Name the IBOutlet connection displayDate. The code is displayed in the liViewController.h code listing below.

Next Add a UILabel and overlay it on the UITextField, take a look at the following screenshot. Remove the text from the UIlabel from in the Attributes inspector. You can’t add an IBAction from the UILabel but you can enable the “User Interaction Enabled” attribute in the Attributes inspector. Also set the tag value to 1. We will use this value later in the view controller custom class to detect when it is clicked and respond accordingly.

This screenshot show the overlaid UILabel on the UITerxtField UIControl. It won't be visible to the user when the app is running.
This screenshot show the overlaid UILabel on the UITerxtField UIControl. It won't be visible to the user when the app is running. | Source

liViewController (.h & .m)

Since the UILabel is part of the UIView and the latter implements the UIResponder which implements the standard events in an UIControl, we can implement one of the events and capture the user click event on the transparent UILabel. Open the ViewController custom class and add the touchesBegan event of the UIResponder. See the code listing below. The NSSet argument is the UIControl that is touched.

Next we will implement this event in the implementation file along with the method that will update the UITextField. In the -(void)touchesBegan:(NSSet*)trigger withEvent:(UIEvent*)event method in the implementation file, start by creating an UITouch object and assign it the trigger anyObject property. See the code below. We then check if the tag of the touched object corresponds to the tag of the UILabel UIControl. If it does, declare a CGRect object which will be the frame that will contain the UIDatePicker that we will add programmatically to the UIview. For this example, I am using the following coordinates: 0,220,320,216. This means x=0, y=220, width=320 (full width) and height=216 (standard size of the UIDatePicker).

Then we will create an UIDatePicker, datePicker, object and add it to the CGRect frame. Finally we will assign the event to the UIDatePicker to call the dateSelected when the value has changed. To complete this method implementation, add the datePicker to the view as a subview. Again take a look the code below on the implementation.

liViewController.h

//
//  liViewController.h
//  ModalDatePicker
//
//  Created by Kevin Languedoc on 10/20/12.
//  Copyright (c) 2012 Kevin Languedoc. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface liViewController : UIViewController
@property (strong, nonatomic) IBOutlet UITextField *displayDate;


-(void)touchesBegan:(NSSet*)trigger withEvent:(UIEvent*)event;


@end

liViewController.m

//
//  liViewController.m
//  ModalDatePicker
//
//  Created by Kevin Languedoc on 10/20/12.
//  Copyright (c) 2012 Kevin Languedoc. All rights reserved.
//

#import "liViewController.h"

@interface liViewController ()

@end

@implementation liViewController

@synthesize displayDate;

-(void)touchesBegan:(NSSet*)trigger withEvent:(UIEvent*)event{
    UITouch *touch = [trigger anyObject];
    
    if(touch.view.tag == 1){
        CGRect pickerFrame = CGRectMake(0,220,320,216);
        UIDatePicker *pickDate = [[UIDatePicker alloc]initWithFrame:pickerFrame];
        
        [pickDate addTarget:self action:@selector(dateSelected:)forControlEvents:UIControlEventValueChanged];
        [self.view addSubview:pickDate];}
    }
    



-(void)dateSelected:(id)sender{

    NSDateFormatter *fmtDate = [[NSDateFormatter alloc] init];
    [fmtDate setDateFormat:@"yyyy/MM/dd" ];
    displayDate.text = [fmtDate stringFromDate:[sender date]];
}


- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [self setDisplayDate:nil];
    [self setDisplayDate:nil];
   

    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}


@end

dateSelected

To finish up, add the -(void)dateSelected:(id)sender method. Notice the (id)sender, this will capture the sender object, which in the example is the date from the UIDatePicker. Next add a NSDateFormater so that we can format the date as needed and convert the date to a string so that it can be assigned to the displayDate UITextField text property.

There you have it. A very simple solution to remove the blinking cursor from an UITextField. By no means is this the only way to do this, but it is a simple and novel solution.

More by this Author


Comments

No comments yet.

    Sign in or sign up and post using a HubPages Network account.

    0 of 8192 characters used
    Post Comment

    No HTML is allowed in comments, but URLs will be hyperlinked. Comments are not for promoting your articles or other sites.


    Click to Rate This Article
    working