How to disable keyboard appearing when hitting on

2020-06-02 09:43发布

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.

8条回答
霸刀☆藐视天下
2楼-- · 2020-06-02 10:18

Use textfield delegate.

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{        
    return NO;
}
查看更多
beautiful°
3楼-- · 2020-06-02 10:18

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.

查看更多
姐就是有狂的资本
4楼-- · 2020-06-02 10:19

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
    }
}
查看更多
戒情不戒烟
5楼-- · 2020-06-02 10:20

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
    }
    
查看更多
Deceive 欺骗
6楼-- · 2020-06-02 10:22
-(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.

查看更多
Fickle 薄情
7楼-- · 2020-06-02 10:25

Use the textField Delegate,

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
 textField=nil;
 return NO;
}
查看更多
登录 后发表回答