在 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 一切正常:警报控制器正常打开,我可以选择显示的 UIAlertAction
s 之一。
在 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
在扩展中返回true
为canBecomeFocused()
,这是造成这些意想不到的一面的原因 效果。移动到第二个时焦点似乎正在消失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 时焦点消失的主要内容,如果未能解决你的问题,请参考以下文章
setSemanticContentAttribute:在 tvOS 10 中不起作用