3

我正在构建一个tvos应用程序。我有一个奇怪的错误,UICollectionView当我导航回该特定视图时,会失去先前选择的单元格的焦点。场景是这样的。

我有两个UIViewControllers ABA有一个UITableView,其中有三个原型单元。每个单元格内部都有一个水平滚动UICollectionView。当我单击其中任何一个时,UICollectionViewCell它会导航到B(详细信息页面)。我B以模态方式呈现。

现在,当我按下 Siri 远程视图上的菜单按钮A时(换句话说,视图B已从视图层次结构中删除),但当前选定的单元格与先前选定的单元格不同。我曾尝试同时使用remembersLastFocusedIndexPathtruefalse,也尝试通过实施

func indexPathForPreferredFocusedViewInCollectionView(collectionView: UICollectionView) -> NSIndexPath?

但是当我导航回视图 A 时,控件会出现此功能。我也在重新加载viewWillAppear功能中的所有内容。

任何人都可以帮助我。谢谢

4

3 回答 3

3

对于collectionView,属性remembersLastFocusedIndexPath应该设置为true ,对于tableView应该设置为false 。

另外,您是否在 viewWillAppear 中重新加载 UITableView,即当 B 弹出并出现 A 时,表数据是否正在刷新?如果是,那么 lastFocusedIndexPath 将在重新加载时为零。

我们面临同样的问题。我们通过在弹出 B 时不重新加载内容来解决它。

保持一个标志说 didPush。按下 B 时将此标志设置为真。当 A 出现时,检查标志是否设置,然后才获取数据并重新加载表。

这对我们有用。

于 2016-06-29T12:39:51.310 回答
1

我不记得确切,但我知道有一个已知问题remembersLastFocusedIndexPath,它没有按预期工作。

这是一种解决方法,尽管使用大量盐,因为它看起来确实有点hacky,并且它使用了覆盖preferredFocusedView属性的常见(但可能不稳定)的方法。

private var viewToFocus: UIView?

override var preferredFocusView: UIView? {
    get {
        return self.viewToFocus
        }
    }

呈现时在本地保存最后一个单元格的 indexPathView AView B

// [1] Saving and scrolling to the correct indexPath:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    ...
    collectionView.scrollToItemAtIndexPath(indexPath:, atScrollPosition:, animated:)
    }

// [2] Create a dispatchTime using GCD before setting the cell at indexPath as the preferredFocusView:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    ...
    let dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(CGFloat.min * CGFloat(NSEC_PER_SEC)))
        dispatch_after(dispatchTime, dispatch_get_main_queue(), {
        self.viewToFocus = collectionView.cellForItemAtIndexPath(indexPath:)

        // [3] Request an update
        self.setNeedsFocusUpdate()

        // [4] Force a focus update
        self.updateFocusIfNeeded()
        }
    }

我们将这两种方法分成两者的原因viewWillAppearviewDidAppear它消除了一些动画跳跃。如果其他人可以提出改进甚至替代解决方案的建议,我也会感兴趣!

于 2016-01-05T16:33:52.840 回答
0

在斯威夫特

如果你想关注collection view Cell 那么你可以使用collectionview Delegate 方法,方法名是

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

你可以像这样使用这种方法......

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

if let previousIndexPath = context.previouslyFocusedIndexPath,
    let cell = collectionView.cellForItemAtIndexPath(previousIndexPath) {
    cell.contentView.layer.borderWidth = 0.0
    cell.contentView.layer.shadowRadius = 0.0
    cell.contentView.layer.shadowOpacity = 0
}

if let indexPath = context.nextFocusedIndexPath,
    let cell = collectionView.cellForItemAtIndexPath(indexPath) {
    cell.contentView.layer.borderWidth = 8.0
    cell.contentView.layer.borderColor = UIColor.blackColor().CGColor
    cell.contentView.layer.shadowColor = UIColor.blackColor().CGColor
    cell.contentView.layer.shadowRadius = 10.0
    cell.contentView.layer.shadowOpacity = 0.9
    cell.contentView.layer.shadowOffset = CGSize(width: 0, height: 0)
    collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: [.CenteredHorizontally, .CenteredVertically], animated: true)
}
} 
于 2016-09-12T11:06:54.310 回答