将becomeFirstResponder重定向到子视图

Man*_* Wa 3 iphone objective-c uiviewcontroller becomefirstresponder ios

是否可以将becomeFirstResponder自身重定向到子视图?

这是我的场景。
我创建了一个新的对象UIWindow,我们称之为secWin对象UINavigationController,其中包含一个对象,我们称之为navCon对象rootViewController
navCon有一个自定义的UIViewController,让我们称之为cusViewCon,因为rootViewController它只包含一个UITextField.
现在,当我按下主窗口中的按钮时,我会调用[secWin makeKeyAndVisible],它会成功显示新窗口。
但现在我希望在任何时候接到电话时UITextField显示键盘,例如,iOS 在呼叫时默认完成此操作。 我尝试通过简单地在我的类中覆盖来完成这一切,如下所示:cusViewConbecomeFirstResponder[secWin makeKeyAndVisible]

becomeFirstRespondercusViewCon

- (BOOL)becomeFirstResponder {
    [_myTextField becomeFirstResponder];

    return NO;
}
Run Code Online (Sandbox Code Playgroud)

它正在工作,但我不知道这是否是正确的方法,因为在文档中它说:

您可以在自定义响应程序中重写此方法,以更新对象的状态或执行某些操作,例如突出显示所选内容。如果重写此方法,则必须在实现中的某个时刻调用 super。

Mat*_*lak 7

当您为 macOS 编写一些代码时,这种方法实际上更有意义,因为几乎任何视图都可能成为第一响应者。所以不用太担心文档。

你的程序走在正确的轨道上,但我会做类似的事情:

- (BOOL)becomeFirstResponder {
    BOOL willBecomeFirstResponder = [super becomeFirstResponder];
    if(willBecomeFirstResponder) {
        return YES; // This element is taking over the first responder so do nothing
    }
    else {
        [_myTextField becomeFirstResponder]; // This element may not become first responder at the moment so forward message to text field
        return NO;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样我们就可以确保超类方法的执行仍然发生。在您的情况下它应该返回 false (如果没有,那么还要查看canBecomeFirstResponder方法),因此文本字段应该接收消息。如果它确实按照设计成为第一响应者,那么最好不要在文本字段上调用它。