5

我想在带有内部UIAlertController的 a 上显示 a 。集合视图需要关注启动,所以我将变量覆盖如下:UIViewControllerUICollectionViewpreferredFocusableView

override var preferredFocusedView: UIView? {
    return self.collectionView
}

使用 tvOS 9 一切正常:警报控制器正确打开,我能够选择UIAlertAction显示的 s 之一。

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

在此处输入图像描述 在此处输入图像描述

这是应用程序的代码。我试图设置preferredFocusableViewalertController.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
    }
}
4

2 回答 2

4

苹果刚刚回复了我的雷达:

在附加的应用程序中,您正在将扩展中的功能覆盖UIScrollView为 return truefor canBecomeFocused(),这是导致这些意外副作用的原因。UIAlertController转向第二个选项时,焦点似乎正在消失 ;然而,它实际上是把焦点转移到包裹在 的各个组件上的滚动视图上 UIAlertController,因为由于上面提到的扩展,现在允许这样做。

为了解决这个问题,创建一个自定义子类,UIScrollView仅在canBecomeFocused()必须返回的实例中使用true

于 2016-10-27T07:16:51.690 回答
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
于 2016-09-12T12:57:01.580 回答