tvOS:焦点无法正确移动

时间:2016-11-28 04:57:54

标签: focus tvos

我有一个带有两个按钮的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,但到目前为止,我还没有能够让它发挥作用。焦点继续按下按钮然后拒绝移动到其他地方。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

  

警告:正在进行焦点更新时,调用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为nil或其他视图。主要在过渡之间调试焦点问题确实很困难。你应该有耐心。

  

重要说明:这取决于您的用例,但是如果您想   在向视图控制器过渡后立即更新焦点(向后   导航),您可能必须在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

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

答案 1 :(得分:1)

您可以使用以下逻辑覆盖preferredFocusEnviromnets:

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

设置完成后,您可以调用

[_myView setNeedsFocusUpdate];
[_myView updateFocusIfNeeded];

条件可以是BOOL condition = tableViewController.editing;或sg。

如果现在有效,你可以延迟调用(0.1秒左右)。