在UITextfield中输入文本后以编程方式更改焦点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在UITextfield中输入文本后以编程方式更改焦点相关的知识,希望对你有一定的参考价值。

我有一个简单的视图,它有两个textview和一个按钮。所有控件都垂直放置。我可以使用遥控器从一个控件导航到另一个控件。但是,我正在尝试使以下方案工作:

  1. 用户启动应用程序(焦点在第一个文本字段)
  2. 用户输入文本字段并使用全屏键盘,然后她点击“下一步”按钮
  3. 该应用程序显示第二个文本字段(全屏键盘),在某些文本中键入并点击“完成”按钮
  4. 该应用程序离开全屏键盘并聚焦按钮

虽然步骤1-3开箱即用,但以编程方式更改焦点(4)不起作用。这是一些代码:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    if(textField == self.textfieldB) {
        self.activeView = self.textfieldB;
        [self setNeedsFocusUpdate];
        [self updateFocusIfNeeded];
        return YES;
    } 
    return NO;
}

并且在- (UIView *)preferredFocusedView中我将返回存储在self.activeView中的任何内容(是的,它将返回按钮实例)。所有方法都按预期调用,但焦点不会改变。我在这做错了什么?

提前致谢!

答案

根据this developer forums thread,行为是有意的:

当解除所呈现的视图控制器(如全屏键盘)时,UIKit将自动将焦点返回到首次显示该视图控制器时的焦点,如果该视图仍可调焦。这样焦点会自动返回到用户期望的位置。目前没有覆盖此行为的机制。

在类似的情况下,我从键盘屏幕返回后延迟切换焦点。这是一个丑陋的黑客,我希望UIKit对此并不那么自以为是。

另一答案

如果包含UIViewController的restoresFocusAfterTransition设置为false,则可以更改它

只需设置restoresFocusAfterTransition = false,然后覆盖preferredFocusEnvironments

以上是关于在UITextfield中输入文本后以编程方式更改焦点的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式删除 UITextField 的内容?

将占位符添加到 UITextField,如何以编程方式快速设置占位符文本?

以编程方式使用 UIPickerView 文本设置 UITextField 文本

如何在UITextView中以编程方式移动光标?

以编程方式附加字符后在 UITextField 中显示文本的结尾[重复]

如果在编辑中更改文本更改 UITextField 崩溃