【问题标题】:Focus on next valid key view on iPhone专注于 iPhone 上的下一个有效键视图
【发布时间】:2010-07-13 22:11:04
【问题描述】:

是否有与 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.
}

【问题讨论】:

    标签: iphone objective-c cocoa cocoa-touch


    【解决方案1】:

    NSResponder-selectKeyView-nextValidKeyView 没有公开的 iOS 等效项。

    当第一响应者是UITextField 的实例时,按 Tab 会实例化 UIEvent 的私有子类,该子类会传递给 -[UIApplication sendEvent:],而后者又会调用 -[UIView _nextKeyResponder]

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

    相反,您可能想要类似于UIWebView 的基于UIToolbar 的表单输入附件。它的按钮可以在适当的时候启用和禁用,它的代理处理实际的按钮按下操作。

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

    【讨论】:

    • 不错的答案!我很欣赏你所讲的细节。
    【解决方案2】:

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

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

    【讨论】:

    • 正如我在问题中所写的,我知道这种方法。我只是想知道是否可以在处理选项卡时以某种方式利用 iOS 中已有的内容。
    【解决方案3】:

    我很惊讶似乎没有其他人在 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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 2018-08-14
      • 2012-10-31
      • 1970-01-01
      相关资源
      最近更新 更多