我怎样才能以编程方式closures键盘?
我需要一种方法来确定当前在视图中select的UITextField
。 这可能没有传递参考或标签?
为了更具体,我需要能够知道哪个UITextField
被选中,以便我可以隐藏键盘。 我需要这个的原因是因为我想创build一个UIToolbar
添加到所有UITextField
的作为input附件。 在这个UIToolbar
我将添加一个“完成”button,当按下时,应该隐藏当前选定的UITextField
的键盘。
有一个委托方法:
- (void)textFieldDidBeginEditing:(UITextField *)textField
Apple文档:
这个方法通知代表指定的文本字段刚成为第一个响应者。 您可以使用此方法更新您的委托状态信息。 例如,您可以使用此方法显示在编辑时应该可见的叠加视图。
还有一个属性:
@property(nonatomic, readonly, getter=isEditing) BOOL editing
Apple文档:
一个布尔值,指示文本字段当前是否处于编辑模式。 (只读)
我假设你的意思是你想知道哪个UITextField
是第一个响应者(这是从键盘input的文本字段)。
没有公共的API(虽然有一个私人的API)。 您可以使用每个文本字段委托的textFieldDidBeginEditing:
方法手动跟踪哪个文本字段是第一个响应者,或者您可以随时使用一些小技巧来查找第一个响应者。
这是诀窍。 UIApplication
对象知道哪个对象是第一响应者,并且可以向其发送消息。 所以你在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
然后你可以find第一个响应者,并检查它是否是一个UITextField
,如下所示:
UIResponder *firstResponder = [UIResponder firstResponderByHack]; if (firstResponder && [firstResponder isKindOfClass:[UITextField class]]) { UITextField *textField = (UITextField *)firstResponder; // do something with textField }
有一个简单的方法来closures键盘, 而无需跟踪当前活动的控件 ,或遍历所有可用的控件或使用UITextFieldDelegate
。
[self.view endEditing:YES]
从文档:
endEditing:
使视图(或其embedded的文本字段之一)退出第一个响应者状态。
– (
BOOL
)endEditing 🙁BOOL
) 强制参数
力
指定YES
强制第一个响应者辞职,不pipe是否要这样做。返回值
如果视图退出第一个响应者状态,则为YES
否则为NO
。讨论
此方法查看当前是第一个响应者的文本字段的当前视图及其子视图层次结构。 如果find一个,它会要求该文本字段作为第一响应者辞职。 如果强制参数设置为YES
,那么甚至不会问到文本字段; 它被迫辞职。
只需在头文件中为UITextView制作一个ivar:
UITextField *editingField; @property (nonatomic, copy) UITextField *editingField;
然后,
- (void)textFieldDidBeginEditing:(UITextField *)textField; { editingField = textField; // Whatever else you want to do }
我在想,你需要不经过引用来区分textField。 所以,build议为什么使用ObjectiveC运行时 。
这非常简单。 首先:
#import <objc/runtime.h>
然后,为其地址定义一个字符:
static char UITextFieldViewIdentifier;
然后设置这样的标识符:
objc_setValue(textField, &UITextFieldViewIdentifier, @"Identifier") //typing on a phone, not so sure about the expression
在委托方法中:
NSString *identifier = objc_getObject(textField, &UITextFieldViewIdentifier)
只要在你想要closures键盘的地方调用这一行:
[self.view endEditing:YES];