关注iPhone上的下一个有效关键视图

时间:2010-07-13 22:11:05

标签: iphone objective-c cocoa cocoa-touch

Mac OS X中的NSResponder方法-selectNextKeyView-nextValidKeyView是否有等效的iPhone?我知道-becomeFirstResponder方法,但是当视图层次结构变得更复杂时,找出调用它的视图并不是很好。

必须有某种方法可以找到这个,因为当我在iPhone模拟器中按Tab键时,焦点会正确地转到下一个UITextField。这让我想知道当我按Tab键时到底发生了什么。有什么想法吗?

更新:这完全符合我的要求,但_nextKeyResponder是私有API,所以禁止使用。有没有办法在不使用私有API的情况下进行'假'标签键按下?

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    // Try to find next responder
    UIView *nextResponder = (UIView *)[self.view _nextKeyResponder];

    if (nextResponder) {
        // Found next responder, so set it.
        [nextResponder becomeFirstResponder];
        [self.tableView scrollRectToVisible:[self.tableView convertRect:[nextResponder frame] fromView:nextResponder] animated:YES];
    } else {
        // Not found, so remove keyboard.
        [textField resignFirstResponder];
    }
    return NO; // We do not want UITextField to insert line-breaks.
}

3 个答案:

答案 0 :(得分:11)

NSResponder -selectKeyView-nextValidKeyView没有公开的iOS等价物。

当第一个响应者是UITextField的实例时,按Tab键实例化UIEvent的私有子类,该子类将传递给-[UIApplication sendEvent:],后者又调用-[UIView _nextKeyResponder]。< / p>

-[UIView _nextKeyResponder]不能像你想象的那样工作。它将关键视图链视为循环,因此永远不会到达else块。出于同样的原因,即使有用于合成键盘事件的公共API,您也可能不想使用它。

相反,您可能想要更像UIWebView基于UIToolbar的表单输入附件。可以在适当的时候启用和禁用其按钮,并且其委托处理实际的按钮按下操作。

但是,要以一般方式实现此类委托,查看how -[UIView _nextKeyResponder] is implemented可能会有所帮助。

答案 1 :(得分:0)

UITextField委托-textFieldDidEndEditing:中,在各种文本字段之间切换(例如,通过测试文本字段的tag属性)。

当您匹配一个文本字段时,请设置另一个文本字段或其他控件以成为下一个响应者。

答案 2 :(得分:0)

我很惊讶其他人似乎没有在iOS上解决这个问题。

我设计了一个解决方案,它可以处理Tab和Shift + Tab,以便前进和后退到iOS上您想要的任何字段,并且不使用任何私有API。

以下是写作:http://weaklyreferenced.wordpress.com/2012/11/13/responding-to-the-tab-and-shift-tab-keys-on-ios-5-ios-6-with-an-external-keyboard/