【问题标题】:Get firstresponder in Objective C在 Objective C 中获取第一响应者
【发布时间】:2012-01-07 19:38:20
【问题描述】:

我无法确定哪个UITextField 是当前的第一响应者。

如果用户单击特定的UITextField,我要做的是设置一个布尔值。所以要做到这一点,我需要能够判断这个特定的文本字段是否已成为第一响应者。

我知道如何设置第一响应者,但不确定如何判断一个字段是否实际上已成为第一响应者。

【问题讨论】:

    标签: iphone objective-c cocoa-touch macos cocoa


    【解决方案1】:

    [...] 但只是不确定如何判断一个字段是否实际上已成为 第一响应者。

    UIViewUIResponder 继承 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
    

    【讨论】:

    • 为什么返回 UIView 而不是 UITextField?
    • @yourfriendzak 因为 UITextField 不是唯一可以成为第一响应者的对象类型。
    【解决方案2】:

    为什么不使用 UITextFieldDelegate 并实现 textFieldDidBeginEditing: 方法?一旦文本字段获得焦点,就会调用它。

    UITextFieldDelegate Protocol Reference

    【讨论】:

      【解决方案3】:
      if(![myTextField isFirstResponder])
      {
          // do stuff
      }
      

      【讨论】:

        【解决方案4】:

        我可能会这样做

        给 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
        

        【讨论】:

          【解决方案5】:

          你可以在你想知道它是否是第一响应者的视图上调用 UIView.IsFirstResponder。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-24
            • 1970-01-01
            • 2011-09-03
            • 1970-01-01
            • 1970-01-01
            • 2013-08-02
            相关资源
            最近更新 更多