将 becomeFirstResponder 重定向到子视图

Redirect becomeFirstResponder to a subview

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

这是我的场景。
我创建了一个新的 UIWindow,我们称之为 secWin,带有 UINavigationController 的对象,我们称之为 navCon,作为 rootViewController.
navCon 有一个自定义 UIViewController,我们称它为 cusViewCon,因为 rootViewController 只包含一个 UITextField.
现在,当我按下主 window 中的一个按钮时,我会调用 [secWin makeKeyAndVisible],它会成功显示新的 window.
但是现在我希望 UITextFieldcusViewCon 接到 becomeFirstResponder 电话时随时显示键盘,例如调用 [secWin makeKeyAndVisible].
时默认由 iOS 完成
我试图通过简单地覆盖我的 cusViewCon class 中的 becomeFirstResponder 来完成所有这些:

- (BOOL)becomeFirstResponder {
    [_myTextField becomeFirstResponder];

    return NO;
}

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

You can override this method in your custom responders to update your object's state or perform some action such as highlighting the selection. If you override this method, you must call super at some point in your implementation.

当您为几乎所有视图都可能成为第一响应者的 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;
    }
}

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

如果您正在使用 Swift,试试这个:

override func becomeFirstResponder() -> Bool {
    return super.becomeFirstResponder() || myTextField.becomeFirstResponder()
}

对于那些也在 Swift 中为自定义响应链而苦苦挣扎的人,这里是我对已接受答案的看法。可能对某人有用。

@discardableResult
override func becomeFirstResponder() -> Bool {
    if super.becomeFirstResponder() { return true }
    someView.becomeFirstResponder()
    return false
}
@discardableResult
override func resignFirstResponder() -> Bool {
    if super.resignFirstResponder() { return true }
    someView.resignFirstResponder()
    return false
}

someView 这里只是您要将事件传递给的子视图。它可以是 UITextViewUITextField 或任何其他 UIResponder