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

Posted

技术标签:

【中文标题】在 tvOS 10 GM 上打开 UIAlertController 时焦点消失【英文标题】:Focus disappearing when opening a UIAlertController on tvOS 10 GM 【发布时间】:2016-09-09 13:05:00 【问题描述】:

我想在 UIViewController 上显示一个 UIAlertController 并在里面显示一个 UICollectionView。集合视图需要关注启动,所以我覆盖了preferredFocusableView变量如下:

override var preferredFocusedView: UIView? 
    return self.collectionView

使用 tvOS 9 一切正常:警报控制器正常打开,我可以选择显示的 UIAlertActions 之一。

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

这是应用程序的代码。我尝试将preferredFocusableView 设置为alertController.preferredFocusedView 或通过删除集合视图的焦点方法但没有结果。

var alertController : UIAlertController?

func showAlert() 

    alertController = UIAlertController(title:"Example title", message: "Example description", preferredStyle: .Alert)

    let action1 = UIAlertAction(title: "Option 1", style: .Default)  (action : UIAlertAction) -> Void in
        //call to another method
    

    // action2, action3, action4...

    let action5 = UIAlertAction(title: "Option 5", style: .Default)  (action : UIAlertAction) -> Void in
        //call to another method
    

    let actionDismiss = UIAlertAction(title: "Dismiss", style: .Destructive)  (action : UIAlertAction) -> Void in
        self.alertController!.dismissViewControllerAnimated(true, completion: nil)
    

    alertController!.addAction(action1)
    alertController!.addAction(action2)
    alertController!.addAction(action3)
    alertController!.addAction(action4)
    alertController!.addAction(action5)
    alertController!.addAction(actionDismiss)

    alertController!.preferredAction = action1

    self.presentViewController(alertController!, animated: true, completion: nil)


override var preferredFocusedView: UIView? 
    if self.alertController != nil 
        return self.alertController!.preferredFocusedView
     else 
        return self.collectionView
    

【问题讨论】:

你在哪里打电话showAlert @DanielStorm 当用户用遥控器点击视图控制器内的按钮时 preferredFocusedView 在 tvOS10 中已弃用 developer.apple.com/reference/uikit/uifocusenvironment/… 【参考方案1】:

Apple 刚刚回复了我的雷达:

在附加的应用程序中,您正在覆盖功能 UIScrollView 在扩展中返回 truecanBecomeFocused(),这是造成这些意想不到的一面的原因 效果。移动到第二个时焦点似乎正在消失 UIAlertController 选项;然而,它实际上是在转移焦点 到包裹在各个组件上的滚动视图 UIAlertController,因为扩展名现在允许这样做 上面提到过。

为了解决这个问题,创建一个自定义的UIScrollView 子类来使用 仅在 canBecomeFocused() 必须返回 true 的情况下。

【讨论】:

【参考方案2】:

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

// 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

【讨论】:

仍然不工作:(我在 UIAlertController 呈现后设置焦点。这两种方法正常工作但焦点仍然消失。

以上是关于在 tvOS 10 GM 上打开 UIAlertController 时焦点消失的主要内容,如果未能解决你的问题,请参考以下文章

在 TvOS 10.2.2 上安装 Charles 证书

如何在 tvOS 上深度链接到 Netflix?

setSemanticContentAttribute:在 tvOS 10 中不起作用

Charles Proxy 捕获 tvOS 10.2?

不再能够在 tvOS 12 模拟器上安装 Charles SSL 证书

如何在 tvOS 上使用 Youtube API 嵌入实时流