помнитLastFocusedIndexPath не работает с UICollectionView

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

я установил

self.collectionView.remembersLastFocusedIndexPath = YES;

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

So if I do

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

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

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

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

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

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


person Snowman    schedule 26.09.2015    source источник
comment
Не тратьте на это время. Это просто НЕ работает сейчас. Если вы хотите сохранить выбранную ячейку, используйте presentViewController.   -  person Alejandro Luengo    schedule 30.10.2015
comment
Кстати, [self PerformSegueWithIdentifier:YOUR_SEGUE_ID sender:self] также не работает с RemembersLastFocusedIndexPath.   -  person Alejandro Luengo    schedule 30.10.2015
comment
Я вижу то же самое. Хотя я использую segues. remembersLastFocusedIndexPath = true работает, когда я использую тип перехода Present Modally, но не когда я использую тип Show (например, Push). Я подал отчет об ошибке в Apple и дам вам знать, если получу ответ. Похоже на ошибку. P.S. Это происходит только при использовании UICollectionView, добавленного к UIViewController. У меня нет проблем при использовании UICollectionViewController. В моем сценарии переход на UICollectionViewController не вариант.   -  person Jeff Bowen    schedule 30.10.2015
comment
У меня presentViewController:animated:completion: тоже не работает :(   -  person Banana    schedule 23.11.2015
comment
У меня такая же проблема   -  person protspace    schedule 24.02.2016
comment
@JeffBowen Есть какие-нибудь обновления в отчете об ошибке с Apple?   -  person picciano    schedule 08.03.2016
comment
Ничего не слышал от них @picciano. :(   -  person Jeff Bowen    schedule 08.03.2016


Ответы (4)


Что сработало для меня, так это убедиться, что предпочтительныйFocusView в viewController был представлением коллекции:

override weak var preferredFocusedView: UIView? {
    return collectionView
}

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

person cfraz89    schedule 08.01.2016

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

person protspace    schedule 24.02.2016
comment
Выполнение reloadData() в viewWillAppear приводило к тому, что при возврате к моему контроллеру представления фокусировался другой элемент. Что имеет смысл, представление коллекции перезагружало ячейки, а повторно используемая ячейка, у которой был фокус до этого, снова получала фокус после перезагрузки. Итак, спасибо, когда я удалил reloadData() в viewWillAppear, я сфокусировался на нужной ячейке. - person Chris Livdahl; 04.01.2017

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

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

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

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

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

person Antoine    schedule 01.10.2015
comment
Нет, это не исправит. - person Banana; 23.11.2015
comment
Это помогло мне указать, как установить начальную настройку remembersLastFocusedIndexPath... спасибо! :) - person Matt Mc; 01.02.2018
comment
По умолчанию для remembersLastFocusedIndexPath уже установлено значение false. - person 6rchid; 12.08.2020

Вы также можете попробовать реализовать подобное поведение. Просто запомните последнюю сфокусированную ячейку в

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

и использовать эту информацию в

func collectionView(collectionView: UICollectionView, canFocusItemAtIndexPath indexPath: NSIndexPath) -> Bool
person Roman Podymov    schedule 11.08.2016