【发布时间】:2012-01-07 19:38:20
【问题描述】:
我无法确定哪个UITextField 是当前的第一响应者。
如果用户单击特定的UITextField,我要做的是设置一个布尔值。所以要做到这一点,我需要能够判断这个特定的文本字段是否已成为第一响应者。
我知道如何设置第一响应者,但不确定如何判断一个字段是否实际上已成为第一响应者。
【问题讨论】:
标签: iphone objective-c cocoa-touch macos cocoa
我无法确定哪个UITextField 是当前的第一响应者。
如果用户单击特定的UITextField,我要做的是设置一个布尔值。所以要做到这一点,我需要能够判断这个特定的文本字段是否已成为第一响应者。
我知道如何设置第一响应者,但不确定如何判断一个字段是否实际上已成为第一响应者。
【问题讨论】:
标签: iphone objective-c cocoa-touch macos cocoa
[...] 但只是不确定如何判断一个字段是否实际上已成为 第一响应者。
UIView 从 UIResponder 继承 isFirstResponder 方法,它告诉你这一点。
在不检查单个控件/视图并且没有针对所有不同类型的可能的第一响应者的多种方法的情况下查找第一响应者的最简单方法是在UIView 上添加一个findFirstResponder 方法:
UIView+FirstResponder.h
#import <UIKit/UIKit.h>
@interface UIView (FirstResponder)
- (UIView *)findFirstResponder;
@end
UIView+FirstResponder.m
#import "UIView+FirstResponder.h"
@implementation UIView (FirstResponder)
- (UIView *)findFirstResponder
{
if ([self isFirstResponder])
return self;
for (UIView * subView in self.subviews)
{
UIView * fr = [subView findFirstResponder];
if (fr != nil)
return fr;
}
return nil;
}
@end
【讨论】:
为什么不使用 UITextFieldDelegate 并实现 textFieldDidBeginEditing: 方法?一旦文本字段获得焦点,就会调用它。
【讨论】:
if(![myTextField isFirstResponder])
{
// do stuff
}
【讨论】:
我可能会这样做
给 ViewController 添加属性
@property (nonatomic, strong) UITextField *firstRespondField;
注册文本字段通知
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textFieldTextDidBeginEditing:)
name:UITextFieldTextDidBeginEditingNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textFieldTextDidEndEdition:)
name:UITextFieldTextDidEndEditingNotification
object:nil];
别忘了在 Dealloc 上删除它
[[NSNotificationCenter defaultCenter] removeObserver:self];
然后实现2个方法
- (void)textFieldTextDidBeginEditing:(NSNotification *)aNotification {
self.firstRespondField = aNotification.object;
}
- (void)textFieldTextDidEndEdition:(NSNotification *)aNotification {
self.firstRespondField = nil;
}
最后,我可能会得到 FirstResponder 对象
self.firstRespondField
【讨论】:
你可以在你想知道它是否是第一响应者的视图上调用 UIView.IsFirstResponder。
【讨论】: