试图找到哪个文本字段是活动的ios

RMD*_*Dan 24 ios

我试图找到当键盘上升时我移动视图时哪个文本字段处于活动状态.我正在尝试从scrollview的子视图中设置我的viewcontroller中的属性.

这是我用来在scrollview中显示视图的代码

-(void)displayView:(UIViewController *)viewController{

[[viewFrame subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 
[viewFrame scrollRectToVisible:CGRectMake(0, 0, 1, 1)
                        animated:NO];

[viewFrame addSubview: viewController.view];

_currentViewController = viewController;
}
Run Code Online (Sandbox Code Playgroud)

- 编辑 -

我改变了对这个问题的思考方式.对不起,我发布时问题含糊不清.我当时筋疲力尽,脑子里有意义.

一个不同但相似的问题:UITextArea和UITextView的公共子类是否会给我firstResponder的起源?或者,在找到原点之前,还需要检查firstResponder的类吗?

Xil*_*xio 36

您需要搜索已成为第一响应者的对象.第一响应者对象是使用键盘的对象(实际上,他是一个具有用户输入焦点的对象).要检查哪个文本字段使用键盘,请迭代文本字段(或仅覆盖所有子视图)并使用该isFirstResponder方法.

编辑:根据要求,示例代码,假设所有文本字段是视图控制器视图的子视图:

for (UIView *view in self.view.subviews) {
    if (view.isFirstResponder) {
        [self doSomethingCleverWithView:view];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这仅迭代视图控制器的*immediate*(一级深度)子级.您将需要使用递归方法来深入挖掘. (6认同)

Sta*_*ida 26

我做了一个扩展.

public extension UIResponder {

    private struct Static {
        static weak var responder: UIResponder?
    }

    public static func currentFirst() -> UIResponder? {
        Static.responder = nil
        UIApplication.shared.sendAction(#selector(UIResponder._trap), to: nil, from: nil, for: nil)
        return Static.responder
    }

    @objc private func _trap() {
        Static.responder = self
    }
}
Run Code Online (Sandbox Code Playgroud)

使用:

if let activeTextField = UIResponder.currentFirst() as? UITextField {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 整齐!一开始我就像是“嗯?” 因此,如果其他人对它的工作方式感到困惑。这是来自sendAction的文档:默认实现将action方法分派给给定的目标对象,或者,如果未指定目标,则分派给第一个响应者 (2认同)