专注于 iPhone 上的下一个有效键视图
Posted
技术标签:
【中文标题】专注于 iPhone 上的下一个有效键视图【英文标题】:Focus on next valid key view on 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.
【问题讨论】:
【参考方案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/
【讨论】:
以上是关于专注于 iPhone 上的下一个有效键视图的主要内容,如果未能解决你的问题,请参考以下文章
iOS 12 将专注于性能提升 / iPhone 减产让苹果市值蒸发 353 亿美元 / 小米或将发布 MIX 2S|灵感早读