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