How can I dismiss the keyboard programmatically?

自作多情 提交于 2019-12-11 01:58:56

问题


I need a way of determining the UITextField that is currently selected in a view. Is this possible without passing a reference or tag?

To be more specific I need to be able to tell which UITextField is selected so that I can hide the keyboard. The reason I need this is because I want to create a UIToolbar to add to all the UITextField's as an input accessory. On this UIToolbar I will add a 'Done' button, when pressed this should hide the keyboard for the currently selected UITextField.


回答1:


There is a delegate method:

- (void)textFieldDidBeginEditing:(UITextField *)textField

Apple Docs:

This method notifies the delegate that the specified text field just became the first responder. You can use this method to update your delegate’s state information. For example, you might use this method to show overlay views that should be visible while editing.

There is also a property:

@property(nonatomic, readonly, getter=isEditing) BOOL editing

Apple Docs:

A Boolean value indicating whether the text field is currently in edit mode. (read-only)




回答2:


I assume you mean you want to know which UITextField is the first responder (which is the text field that gets input from the keyboard).

There is no public API for this (though there is a private API). You can track which text field is the first responder manually using the textFieldDidBeginEditing: method of each text field's delegate, or you can use a little trickery to find the first responder at any time.

Here's the trick. The UIApplication object knows which object is the first responder, and can send a message to it. So you write a category like this on UIResponder:

UIResponder+firstResponderHack.h

#import <UIKit/UIKit.h>

@interface UIResponder (firstResponderHack)

+ (UIResponder *)firstResponderByHack;

@end

UIResponder+firstResponderHack.m

#import "UIResponder+firstResponderHack.h"

@interface FirstResponderFinder : NSObject
@property (strong, nonatomic) UIResponder *firstResponder;
@end

@implementation FirstResponderFinder
@synthesize firstResponder = _firstResponder;
@end

@implementation UIResponder (firstResponderHack)

- (void)putFirstResponderIntoFinder:(FirstResponderFinder *)finder {
    if (self.isFirstResponder)
        finder.firstResponder = self;
}

+ (UIResponder *)firstResponderByHack {
    FirstResponderFinder *finder = [FirstResponderFinder new];
    // Sending an action to nil sends it to the first responder.
    [[UIApplication sharedApplication] sendAction:@selector(putFirstResponderIntoFinder:) to:nil from:finder forEvent:nil];
    return finder.firstResponder;
}

@end

Then you can find the first responder, and check whether it's a UITextField, like this:

UIResponder *firstResponder = [UIResponder firstResponderByHack];
if (firstResponder && [firstResponder isKindOfClass:[UITextField class]]) {
    UITextField *textField = (UITextField *)firstResponder;
    // do something with textField
}



回答3:


There is an easy way to dismiss the keyboard without having to track the currently active control, or iterating through all the available controls, or using a UITextFieldDelegate.

[self.view endEditing:YES]

From the docs:

endEditing:

Causes the view (or one of its embedded text fields) to resign the first responder status.

- (BOOL)endEditing:(BOOL)force

Parameters
force
Specify YES to force the first responder to resign, regardless of whether it wants to do so.

Return Value
YES if the view resigned the first responder status or NO if it did not.

Discussion
This method looks at the current view and its subview hierarchy for the text field that is currently the first responder. If it finds one, it asks that text field to resign as first responder. If the force parameter is set to YES, the text field is never even asked; it is forced to resign.




回答4:


Just make an ivar for the UITextView in your header file:

UITextField *editingField;
@property (nonatomic, copy) UITextField *editingField;

Then,

- (void)textFieldDidBeginEditing:(UITextField *)textField;
{
    editingField = textField;

    // Whatever else you want to do 
}



回答5:


I'm thinking that you need to diff the textFields without reference. So, the recommended why is using ObjectiveC runtime.
It's pretty straight forward. Firstly:

  #import <objc/runtime.h>

Then, define a char for its address:

   static char UITextFieldViewIdentifier;

Then set the identifier with something like this:

  objc_setValue(textField, &UITextFieldViewIdentifier, @"Identifier") //typing on a phone, not so sure about the expression

In the delegate method:

   NSString *identifier = objc_getObject(textField, &UITextFieldViewIdentifier)



回答6:


Just call this line where you want to dismiss the keyboard:

[self.view endEditing:YES];


来源:https://stackoverflow.com/questions/8956704/how-can-i-dismiss-the-keyboard-programmatically

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!