Question

I have a text field , and i need when the user presses it to show a custom picker.

The picker is shown fine , but the problem is that the keyboard appears on the bottom and i dont want that.

This is an iPad project which i am trying to convert from my iphone one. On the iPhone , this works well and the keyboard is always hidden.

What could i be missing/forgetting to do here ?

EDIT


For future reference what actually happened here , was that in fact both times (iphone & ipad) the keyboard was not hidden. I just thought that it was hidden in the iphone because my picker , which was popping from the bottom was hiding the keyboard as it was on top of it. But on ipad this wasnt the case.

Anyway i fixed it , using the delegate method suggested below.

Caution , i accepted this answer cause it was the one answering specifically what i wanted. The rest of the answers are correct and my considered better for other implementations.

Was it helpful?

Solution

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    // Here You can do additional code or task instead of writing with keyboard
    return NO;
}

this delegate method will get called first when you hit to textfield and if you write NO as a boolean value means you dont want to begin editing so it will not present Keyboard.

OTHER TIPS

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    if(textfield == yourtextField)
    {
        [textfield resignFirstResponder];
        // Show you custom picker here....
        return NO;
    }     
}

and you need to implement the uitextfielddelegate in the controller.

and give assign the delegate to yourtextField.

Use textfield delegate.

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{        
    return NO;
}

It looks like all of these answers take one approach, to simply deny the keyboard before it comes up. This prevents first responder status, which has many advantages.

One simple approach that allows you to maintain first responder status is to create an empty view and assign that to the inputView property on your input field. If you are using iOS 9 (or later?) you will also have to get rid of the inputAssistantItem objects as well.

UITextField *field = [[UITextField alloc] init];
field.inputView = self.emptyKeyboard.view;

UITextInputAssistantItem *aItem = [field inputAssistantItem];
aItem.leadingBarButtonGroups = @[];
aItem.trailingBarButtonGroups = @[];

Then if you want to control the field from an alternate view controller, you can do so by adding targets:

[field addTarget:self.numberPad action:@selector(editingBegan:) forControlEvents:UIControlEventEditingDidBegin];
[field addTarget:self.numberPad action:@selector(editingEnded:) forControlEvents:UIControlEventEditingDidEnd];
[field addTarget:self.numberPad action:@selector(fieldChanged:) forControlEvents:UIControlEventEditingChanged];

It is also possible to do this a lot more cleanly by subclassing UITextField.

Use the textField Delegate,

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
 textField=nil;
 return NO;
}

swift 3.0 version

First set the delegate for the text field

self.textfield.delegate = self

Then in an extension

extension ViewController: UITextFieldDelegate {
    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        return false
    }
}
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    // Here you can do for Specific text Field by 
    if (textField==(the text field you don't want to show keyboard)) {
        NSLog(@"don't show keyboard");
        return NO;
    }
    else {
        return YES;
    }
}

Swift 3/4

  1. Add:- UITextFieldDelegate in your class.

  2. Add:- self.textField.delegate = self In ViewDidLoad

  3. last one just add this func -

    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        return false
    }
    
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top