如果有人遇到此问题,只需检查控制台中是否打印了以下调试消息。
警告:在焦点更新正在进行时调用 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](https://i.stack.imgur.com/fZFe1.png)
这将记录焦点引擎更新焦点的所有尝试。这真的很有帮助。