在tvOS 10 GM上打开UIAlertController时焦点消失了

时间:2016-09-09 13:05:01

标签: swift tvos uialertcontroller uialertaction tvos10

我希望在UIAlertController的{​​{1}}上方显示UIViewController。集合视图需要专注于启动,因此我将UICollectionView变量覆盖如下:

preferredFocusableView

使用tvOS 9一切正常:警报控制器正常打开,我可以选择显示的override var preferredFocusedView: UIView? { return self.collectionView } 之一。

在tvOS 10 Golden Master上,打开警报控制器并滚动到另一个动作后,焦点从屏幕上消失,我无法滚动到其他操作或点击Siri遥控器的菜单按钮。应用程序仍然停留在警报控制器中,当我尝试滚动到其他操作但屏幕上没有任何操作时,我可以听到滚动声音。我必须强制退出应用程序并重新打开它。

enter image description here enter image description here

这是应用的代码。我尝试将UIAlertAction设置为preferredFocusableView或删除集合视图的焦点方法,但没有结果。

alertController.preferredFocusedView

2 个答案:

答案 0 :(得分:4)

Apple回复了我的雷达:

  

在附加的应用程序中,您将覆盖该功能   返回UIScrollView的扩展名中的true   canBecomeFocused(),这是这些意外方面的原因   效果。移动到第二个时,焦点似乎正在消失   UIAlertController选项;然而,它实际上是转移焦点   滚动视图包裹着各种组件   UIAlertController,因为现在由于扩展而允许   如上所述。

     

要解决此问题,请创建要使用的UIScrollView的自定义子类   仅在canBecomeFocused()必须返回true

的情况下

答案 1 :(得分:1)

您正在覆盖整个系统焦点引擎。试试这个:

// MARK: - Update Focus Helper
var viewToFocus: UIView? = nil {
    didSet {
        if viewToFocus != nil {
            self.setNeedsFocusUpdate()
            self.updateFocusIfNeeded()
        }
    }
}

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

然后在您希望焦点更改为视图时将警报设置为视图:

viewToFocus = someView