tvOS:如何在TabBar和UICollectionView之间处理焦点变化并防止崩溃

时间:2016-08-05 12:55:55

标签: swift uicollectionview uitabbarcontroller tvos

我通过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
}

2 个答案:

答案 0 :(得分:0)

您无需在此处添加任何焦点代码即可。您在控制台中看到的错误消息是由于您的as! itemCell强制转换:当焦点从集合视图移动到标签栏时,context.nextFocusedView将是UITabBarButton而不是集合视图细胞。老实说,我不太了解Swift,但我想如果你删除!那么你应该停止看到这次崩溃吗?

答案 1 :(得分:0)

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

//对于Focus Engine

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
}