tvOS:如何处理 TabBar 和 UICollectionView 之间的焦点更改并防止崩溃

Posted

技术标签:

【中文标题】tvOS:如何处理 TabBar 和 UICollectionView 之间的焦点更改并防止崩溃【英文标题】:tvOS: How to Handle Focus Change between TabBar and UICollectionView and Prevent Crashing 【发布时间】:2016-08-05 12:55:55 【问题描述】:

我通过 Xcode 的 tvOS“选项卡式应用程序”选项创建了一个测试 tvOS 应用程序。在第一个选项卡视图控制器中,放置一个带有一些简单文本单元格的 UIcollectionView。

当应用程序运行时,可以从标签栏向下移动到 UICollectionView,它接受焦点并且可以毫无问题地在视图的项目之间移动。

但是,尝试从 UICollectionView 移回标签栏会使应用程序崩溃,并显示以下消息:

无法将“UITabBarButton”(0x199b92828)类型的值转换为“tabtest.itemCell”(0x1000153c8)。

我认为这意味着焦点引擎只是“看到”collectionView,我必须添加代码来处理跳转回 UITabBarButton。

我搜索了很多关于如何处理焦点变化的信息,但没有找到任何具体的信息。作为 ios/tvOS 开发的新手,我可能缺少一些明显的东西。

谁能解释一下如何管理标签栏和 UICollectionView 之间的焦点?

这是我用来处理 UICollectionView 焦点的代码:

// For Focus Engine  
func collectionView(collectionView: UICollectionView, didUpdateFocusInContext context: UICollectionViewFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) 


func collectionView(collectionView: UICollectionView, shouldUpdateFocusInContext context: UICollectionViewFocusUpdateContext) -> Bool 
    if let cell: UICollectionViewCell = context.nextFocusedView as! itemCell
        _ = self.collectionView.indexPathForCell(cell)
    
    return true

【问题讨论】:

【参考方案1】:

您无需添加任何代码即可在此处使用焦点。您在控制台中看到的错误消息是因为您的 as! itemCell 演员:当焦点从集合视图移动到选项卡栏时,context.nextFocusedView 将是 UITabBarButton 而不是集合视图单元格。老实说,我不太了解 Swift,但我认为如果您删除 !,那么您应该不会再看到这个崩溃了?

【讨论】:

迟到的谢谢贾斯汀。我终于通过最终理解代码错误来弄清楚了。 “如果让细胞:......”是不必要的,并导致了崩溃。【参考方案2】:

答案是意识到“如果让细胞......”不需要。添加以下使其正常工作。

// 用于焦点引擎

func collectionView(collectionView: UICollectionView, didUpdateFocusInContext context: UICollectionViewFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) 


func collectionView(collectionView: UICollectionView, canFocusItemAtIndexPath indexPath: NSIndexPath) -> Bool 
    return true


func collectionView(collectionView: UICollectionView, shouldUpdateFocusInContext context: UICollectionViewFocusUpdateContext) -> Bool 
    return true


func collectionView(collectionView: UICollectionView, shouldSlectItemAtIndexPath context: UICollectionViewFocusUpdateContext) -> Bool 
    return true

【讨论】:

以上是关于tvOS:如何处理 TabBar 和 UICollectionView 之间的焦点更改并防止崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 tvOS 遥控器中的菜单按钮操作

tvOS 上 UITabBarItem 的选定和聚焦状态

如何处理片段和活动中的后压

如何处理 UIDeviceOrientationFaceUp 和 UIDeviceOrientationFaceDown?

openfire 外部组件如何处理存在和订阅?

如何处理以下数据