tvOS:焦点移动不正确

2023-12-15

我有一个 UIView,上面有两个按钮。在里面MyView类我有这个代码:

-(BOOL) canBecomeFocused {
    return YES;
}

-(NSArray<id<UIFocusEnvironment>> *)preferredFocusEnvironments {
    return @[_editButton, _addButton];
}

-(IBAction) editTapped:(id) sender {
    BOOL editing = !tableViewController.editing;
    [_editButton setTitle:editing ? @"Done" : @"Edit" forState:UIControlStateNormal];
    _addButton.hidden = !editing;
    [tableViewController setEditing:editing animated:YES];

}

基本思想是用户可以将焦点移动到编辑按钮,然后可以显示“添加”按钮。

问题开始是因为每次我点击编辑按钮时,焦点都会转移到表格视图。我实际上希望它移至“添加”按钮。我还想要它,以便在编辑禁用时,编辑按钮保持焦点。但它再次向下移动到表格视图。

所以我尝试了上面的代码。这是有效的,因为焦点可以移动到视图并移动到按钮。但一旦它在那里,我就无法让它移动到其他地方。

我读过的所有内容都说只是覆盖preferredFocusEnvironments但到目前为止我还无法让它发挥作用。焦点持续移至某个按钮,然后拒绝移至其他地方。

有任何想法吗?


如果有人遇到此问题,只需检查控制台中是否打印了以下调试消息。

警告:在焦点更新正在进行时调用 updateFocusIfNeeded。该调用将被忽略。

我有以下代码:

// MARK: - Focus Environment

var viewToBeFocused: UIView?

func updateFocus() {
    setNeedsFocusUpdate()
    updateFocusIfNeeded()
}

override var preferredFocusEnvironments: [UIFocusEnvironment] {
    if let viewToBeFocused = self.viewToBeFocused {
        self.viewToBeFocused = nil
        return [viewToBeFocused]
    }
    return super.preferredFocusEnvironments
}

我当时打电话给updateFocus()方法多次,同时viewToBeFocused要么为零,要么有其他观点。调试主要在转换之间的焦点问题确实很困难。你应该有耐心。

需要注意的是:这取决于您的用例,但如果您想 在视图控制器转换后立即更新焦点(向后 导航),您可能必须在 viewDidLoad 中设置以下内容:

restoresFocusAfterTransition = false // default is true

如果这是真的,视图控制器将倾向于聚焦最后一个聚焦的视图,即使我们通过调用强制更新焦点updateFocusIfNeeded()。在这种情况下,由于焦点更新已经在进行中,因此您将收到本答案顶部前面提到的警告。

调试焦点问题

使用以下链接调试焦点问题:https://developer.apple.com/documentation/uikit/focus_interactions/debugging_focus_issues_in_your_app

首先在“编辑方案”>“启动时传递的参数”下启用焦点调试器:

-UIFocusLoggingEnabled YES

enter image description here

这将记录焦点引擎更新焦点的所有尝试。这真的很有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tvOS:焦点移动不正确 的相关文章