2016-01-05 4 views
3

Я создаю приложение tvos. У меня странная ошибка, когда UICollectionView теряют фокус ранее выбранной ячейки, когда я перехожу назад к этому конкретному виду. Сценарий - это нечто подобное.tvos UICollectionView теряет фокус на предыдущую ячейку фокуса

У меня есть два UIViewControllersA и B. A имеет UITableView, и в нем есть три прототипа. Каждая ячейка имеет горизонтальную прокрутку UICollectionView внутри нее. Когда я нажимаю на любой из UICollectionViewCell, он переходит к B (подробная страница). Я представляю B modally.

Теперь, когда я нажимаю кнопку меню на удаленном экране Siri A (другими словами, вид B удален из иерархии просмотра), но текущая выбранная ячейка отличается от выбранной ранее. Я пытался использовать remembersLastFocusedIndexPath с обеими true и false ценностей, а также пытался путем внедрения

func indexPathForPreferredFocusedViewInCollectionView(collectionView: UICollectionView) -> NSIndexPath?

но контроль Невиш приходит к этой функции, когда я вернуться обратно вид A. Я также перегрузочным каждую вещь в viewWillAppear функция.

Может ли кто-нибудь помочь мне в этом. Спасибо

+0

Почему вы перезагружаете все, когда появляется A (re)? –

+0

Устранена ли эта проблема @Madu – morroko

+0

@Madu Я также столкнулся с той же проблемой. Вы нашли решение для этого. –

ответ

1

Я точно не помню, но я знаю, что была известная проблема для remembersLastFocusedIndexPath, где она не работала должным образом.

Это один обходной путь, хотя и взять его с собой роялем соли, как это кажется слегка Hacky и использует общий (но потенциально нестабильный) подход перекрывая preferredFocusedView собственности.

private var viewToFocus: UIView? 

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

Сохранить локально indexPath из последнего клетки в View A при представлении View 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() 
     } 
    } 

причине мы разделили два метода в оба viewWillAppear и viewDidAppear является то, что он устраняет немного анимации Прыгать. Если бы кто-нибудь еще мог вскакивать с предложениями по улучшению или даже альтернативным решениям, мне также было бы интересно!

2

Свойство remembersLastFocusedIndexPath должен быть установлен в истинной для CollectionView и ложные для Tableview.

Также вы перезагружаете UITableView в viewWillAppear i.e Обновлены ли данные таблицы, когда B выскочил, и появится A? Если да, то lastFocusedIndexPath будет нулевым при перезагрузке.

Мы столкнулись с той же проблемой. Мы решили это, не перезагружая содержимое, когда B выскочил.

Поддержание флага say didPush. Установите этот флаг в true, когда B нажат. Когда появляется A, проверьте, установлен ли флаг, и только затем выберите данные и перезагрузите таблицу.

Это сработало для нас.

0

В Swift

Если вы хотите сосредоточиться коллекции вид Cell затем Вы можете использовать метод CollectionView Делегирование, имя метода

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) 
} 
} 
Смежные вопросы