2012-01-07 64 views
3

我無法確定哪個UITextField是當前的第一響應者。獲取目標C中的第一響應者

我想要做的是設置一個布爾值,如果用戶點擊一個特定的UITextField。所以要做到這一點,我需要能夠判斷這個特定的文本字段是否成爲第一響應者。

我知道如何設置第一響應者,但不知道如何判斷一個字段是否真的成爲第一響應者。

回答

24

[...]但只是不知道如何判斷一個字段是否實際上已成爲 急救員。

UIView繼承UIResponderisFirstResponder方法,它告訴你這一點。

最簡單的方式找到任何第一反應是不檢查各個控件/意見,並沒有對各種不同類型的可能第一反應的多種方法是隻做出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 
+0

爲什麼它返回的UIView,而不是得到的UITextField對象FirstResponder? – zakdances 2012-05-25 05:22:51

+3

@yourfriendzak由於UITextField不是唯一可以成爲第一響應者的對象類型。 – Steve 2012-05-25 14:25:52

0

您只需調用UIView.IsFirstResponder你想知道,如果它是第一個響應者的看法。

3
if(![myTextField isFirstResponder]) 
{ 
    // do stuff 
} 
1

我可以做這樣的

添加屬性的ViewController

@property (nonatomic, strong) UITextField *firstRespondField; 

註冊文本字段Notificaiton

[[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; 

} 

最後,我可能會被

self.firstRespondField