2015-09-26 2 views
4

У меня есть представление коллекции со стандартным горизонтальным расположением. После представления контроллера вида, а затем его отклонения, сброс представления коллекции возвращается к первой ячейке, хотя последняя сфокусированная ячейка не была такой.remembersLastFocusedIndexPath не работает на UICollectionView

Я установил

self.collectionView.remembersLastFocusedIndexPath = YES; 

Что странно, что это происходит только тогда, когда я нажимаю на контроллер представления на моем навигационном контроллере.

Так что, если я

[self.navigationController pushViewController:controller animated:YES]; 

, а затем отпустить, remembersLastFocusedIndexPath не работает должным образом.

Однако, если я:

[self presentViewController:controller animated:YES completion:nil]; 

Затем он работает, как ожидалось.

Любая идея, почему она не будет работать через контроллер навигации?

+1

Не теряйте время на этом. Это просто НЕ работает. Если вы хотите, чтобы ваша выбранная ячейка использовала presentViewController. –

+0

Кстати, [self performSegueWithIdentifier: YOUR_SEGUE_ID отправитель: self] не работает с remembersLastFocusedIndexPath также –

+1

Я вижу то же самое. Тем не менее, я использую segues. 'remembersLastFocusedIndexPath = true' работает, когда я использую« Present Modally »segue kind, но не тогда, когда я использую вид« Показать (например, Push) ».Я подал отчет об ошибке с Apple и сообщит вам, если я что-нибудь услышу. Похоже на ошибку. P.S. Это происходит только при использовании 'UICollectionView', добавленного в' UIViewController'. У меня нет проблем при использовании 'UICollectionViewController'. В моем случае переход на 'UICollectionViewController' не является вариантом. –

ответ

1

По умолчанию система запоминает позицию. Вероятно, вам следует исправить эту проблему, установив remembersLastFocusedIndexPath на false.

Вы также мог бы реализовать UICollectionViewDelegate метод: func indexPathForPreferredFocusedViewInCollectionView(collectionView: UICollectionView) -> NSIndexPath?

Документация говорит нам:

Функциональность этого метода делегата эквивалентна переопределение метода preferredFocusedView Класса UICollectionView в протоколе UIFocusEnvironment. Если метод просмотра memsetLastFocusedIndexPath для коллекции имеет значение YES, этот метод определяет путь индекса, который фокусируется, когда просмотр коллекции сфокусирован в первый раз.

Но для вашей проблемы установка remembersLastFocusedIndexPath на false должна быть исправлена.

+0

Nope , это не исправить. – Banana

+0

Это помогло мне указать, как установить «начальную настройку» 'remembersLastFocusedIndexPath' ... спасибо! :) –

5

То, что сработало для меня было обеспечение того, чтобы preferredFocusView на ViewController был вид коллекции:

override weak var preferredFocusedView: UIView? { 
    return collectionView 
} 

После этого remembersLastFocusedIndexPath, кажется, работает.

+0

Это сработало для меня. – Daniel

2

убедитесь, что вы не перезагружаете Data() в viewWillAppear вашей коллекцииView или TableView. В противном случае запомнятFocus будет сброшен до значения по умолчанию (для просмотра коллекции в моем случае это была центральная видимая ячейка)

+0

Выполнение reloadData() в viewWillAppear вызывало другое элемент, который будет сфокусирован при возвращении к моему контроллеру представления. Что имеет смысл, просмотр коллекции был перезагрузкой ячеек, а ячейка, использующая повторное использование, которая имела фокус, снова получала фокус снова после перезагрузки. Поэтому, спасибо, когда я удалил reloadData() in viewWillAppear У меня тогда была целевая ячейка. –

0

Вы также можете попробовать реализовать подобное поведение. Просто запомните последнюю сфокусированную ячейку в func collectionView(collectionView: UICollectionView, didUpdateFocusInContext context: UICollectionViewFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) и используйте эту информацию в: func collectionView(collectionView: UICollectionView, canFocusItemAtIndexPath indexPath: NSIndexPath) -> Bool