将becomeFirstResponder重定向到子视图

问题描述 投票:1回答:2

是否有可能将becomeFirstResponder从self重定向到子视图?

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

- (BOOL)becomeFirstResponder {
    [_myTextField becomeFirstResponder];

    return NO;
}

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

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

ios objective-c iphone uiviewcontroller becomefirstresponder
2个回答
3
投票

当您为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;
    }
}

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


0
投票

如果您使用的是Swift,请尝试以下方法:

override func becomeFirstResponder() -> Bool {
    return super.becomeFirstResponder() || myTextField.becomeFirstResponder()
}
© www.soinside.com 2019 - 2024. All rights reserved.