2016-08-05 41 views
1

我通过Xcode的tvOS“选项卡式应用程序”选项创建了一个测试tvOS应用程序。在第一个标签视图控制器放置一个UIcollectionView与一些简单的文本单元格。tvOS:如何处理TabBar和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

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

//对于焦点引擎

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 
} 
0

你不需要添加任何代码,重点在这里工作。您在控制台中看到的错误消息是由于您的as! itemCell强制转换:焦点从集合视图移至标签栏时,context.nextFocusedView将不是集合视图单元格,而是UITabBarButton。我真的不知道斯威夫特足够确定,但我认为如果你删除!那么你应该停止看到这次崩溃?

+0

迟来的感谢贾斯汀。我终于明白代码是错误的,终于弄清楚了。 “如果让细胞:......”是不必要的,并导致崩溃。 –