gpt4 book ai didi

ios - 如何强制 View Controller 调用 preferredFocusView?

转载 作者:行者123 更新时间:2023-11-29 00:46:33 31 4
gpt4 key购买 nike

所以我有一个具有以下方法的 View Controller :

    var viewToFocus: UIView? = nil {
didSet {
if viewToFocus != nil {
self.setNeedsFocusUpdate()
self.updateFocusIfNeeded()
}
}
}

override weak var preferredFocusedView: UIView? {
if viewToFocus != nil {
let theView = viewToFocus
viewToFocus = nil
return theView
} else {
return super.preferredFocusedView;
}
}

所以基本上我可以通过将 viewToFocus 设置为一个值来强制将焦点更新到我想要的 View ,这在大多数情况下都很有效。但是,当删除 subview 时,这似乎无法正常工作,并且永远不会调用 preferredFocusedView

就我的 subview 而言,它是一个覆盖屏幕的覆盖层(不要问我为什么不使用模式,这是有原因的)并且将父 View Controller 作为委托(delegate)。父 View Controller 有以下方法:

// Delegate of 'OverlayView'. Called BEFORE it is added as a subview
func beforeOpeningOverlay() {
focusedViewBeforeOverlay = UIScreen.mainScreen().focusedView
}

// Delegate of 'OverlayView'. Called after its close action is triggered.
func closedOverlay(overlay: OverlayView) {
if focusedViewBeforeOverlay != nil {
viewToFocus = focusedViewBeforeOverlay
focusedViewBeforeOverlay = nil
}
overlay.delegate = nil
overlay.removeFromSuperview()
}

由于某些原因,当 closedOverlay 被调用时,并且 focusedViewBeforeOverlay 有一个有效的非零 View ,它永远不会是从父 View 中删除叠加层后关注的下一个 View 。就像我说的那样,preferredFocusedView 永远不会被调用,而是专注于焦点引擎决定应该成为下一个焦点的任何内容。

有人知道为什么会这样吗?删除 subview 是否不允许您触发焦点更新?

所以顺序,或者至少是预期的顺序,应该是:

  1. 某些东西触发 OverlayView 被实例化
  2. beforeOpeningOverlay() 被调用,当前焦点 View 被设置为 focusedViewBeforeOverlay。然后打开叠加层并获得焦点
  3. 调用 closedOverlay()
  4. 触发覆盖 View 关闭
  5. viewToFocus = focusedViewBeforeOverlay 行被调用
  6. 应该为父 View Controller 调用焦点更新,调用它的 preferredFocusedView
  7. preferredFocusedView 应该返回设置为 focusedViewBeforeOverlayviewToFocus 并将焦点恢复到覆盖层打开之前聚焦的 View

问题似乎是第 5 步及之后的步骤没有被调用

最佳答案

正如 Roman 所评论的,referredFocusedView 在 tvOS 10 中已被弃用。现在您必须定义您的 preferredFocusEnvironments

在你的情况下会是这样的:

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

您还需要调用 self.setNeedsFocusUpdate() 来更新焦点。

关于ios - 如何强制 View Controller 调用 preferredFocusView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38558709/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com