如何让 tvOS (AppleTV) 上的特定按钮 运行 获得焦点? (Objective C)

How can I get a specific button running on tvOS (AppleTV) to take focus? (Objective C)

该项目有一些带有不同按钮的视图。当我隐藏一个视图并显示另一个视图时,我无法将焦点放在我的按钮上。

我认为与setNeedsFocusUpdate有关。我已经阅读了苹果文档。没有任何例子。

有谁知道怎么做并举个例子 (Objective C)?

您需要覆盖 preferredFocusedView,当您隐藏一个视图并在那里显示时调用此方法 setNeedsFocusUpdate,您的 preferredFocusedView 实现应该是这样的

- (UIView *)preferredFocusedView
{
    // Add your logic here, it could be more complicated then what is below
    if (view1.hidden)
    {
        return _button;
    }
    else 
    {
        return _button2
    }
}

如果你想让自定义视图获得焦点,覆盖 canBecomeFocused 方法和 return true

编辑

你可以使用添加断点并执行这个命令po [buttonYouWantToFocus _whyIsThisViewNotFocusable]它会告诉你为什么它不能聚焦。

如果您以编程方式添加子视图,也许这就是您想要的:

- (UIView *)preferredFocusedView {
    return [view1 preferredFocusedView];
}

我知道你的问题是针对 Objective-C 的,但这里有一种方法可以在 Swift 中解决这个问题。您需要覆盖 preferredFocusedView 属性.

override var preferredFocusedView: UIView? {
    guard primaryView.hidden == false else {
        return secondaryView
    }
    return primaryView
}

然后只要发生导致您的视图被隐藏的事件,就调用 setNeedsFocusUpdate()。希望这有助于...

另一种选择(如果您不想使用 preferredFocusedView)是,不要将视图设置为隐藏,只需将其从其父视图中删除即可,如下所示:

myView.removeFromSuperview()

这会自动将焦点从已移除的按钮上移开,并将其转移到仍在屏幕上的另一个按钮上。