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 之间的焦点更改并防止崩溃的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 UIDeviceOrientationFaceUp 和 UIDeviceOrientationFaceDown?