Мобильная разработка

tvOS 26.3: Фокус пропускает UICollectionView внутри UITableViewCell

Проблема навигации фокуса в tvOS 26.3: UICollectionView пропускает секции при движении назад с предупреждением 'already-visited container'.

2 ответа 1 просмотр

tvOS 26.3: Фокус пропускает UICollectionView внутри UITableViewCell с предупреждением “already-visited container”

Я работаю над tvOS-приложением на Swift, где структура UI выглядит следующим образом:

  • UITableView
  • Каждый UITableViewCell содержит UICollectionView
  • Таблица имеет 3 секции:
  • Секция 1 → Горизонтальный UICollectionView
  • Секция 2 → Горизонтальный UICollectionView
  • Секция 3 → Вертикальный UICollectionView

Ожидаемое поведение:
Фокус должен нормально перемещаться между секциями:

  • Секция 1 → Секция 2 → Секция 3
  • И обратно: Секция 3 → Секция 2 → Секция 1

Проблема:
После обновления до tvOS 26.3 (Xcode 26.3) я столкнулся с проблемой фокуса:

  • Перемещение фокуса вперед (1 → 2 → 3) работает корректно
  • Но при перемещении назад (3 → 2):
  • Фокус полностью пропускает Секцию 2
  • Он сразу перемещается в Секцию 1

Предупреждение в консоли Xcode:
Ignoring attempt to add focus items in already-visited container. This can potentially cause infinite recursion.

Важные замечания:

  • Эта проблема возникает только на tvOS 26.3
  • Тот же код работает идеально на tvOS 18.5
  • Изменения в логике обработки фокуса не вносились
  • Приложение уже завершено — это регресс после обновления ОС

Вопросы:
Почему движок фокуса пропускает вторую секцию?
Что вызывает предупреждение “already-visited container” в данном случае?
Есть ли изменения в системе фокуса в tvOS 26, требующие другого подхода?
Как исправить навигацию фокуса между вложенными collection views?

Проблема с пропуском UICollectionView внутри UITableViewCell при навигации фокуса в tvOS 26.3 вызвана изменениями в движке фокуса, которые приводят к появлению предупреждения “already-visited container”. Эта регрессия проявляется только при обратном движении фокуса между секциями с горизонтальными UICollectionViews, в то время как на tvOS 18.5 тот же код работает корректно. Основная причина заключается в том, что система фокуса tvOS 26.3 теперь рассматривает коллекции как “уже посещенные” при движении назад, что вызывает пропуски и потенциальную рекурсию.


Содержание


Анализ проблемы фокуса в tvOS 26.3

Проблема, с которой вы столкнулись, является классическим примером регрессии в работе системы фокуса tvOS после обновления до версии 26.3. На Stack Overflow уже появился вопрос от разработчика Pratham Gupta, столкнувшегося с аналогичной проблемой.

Что происходит под капотом? Система фокуса tvOS 26.3 изменила алгоритм обработки навигации между UICollectionView внутри UITableViewCell. Когда вы движетесь вперед (секция 1 → секция 2 → секция 3), все работает гладко. Но при обратном движении система фокуса “помнит”, что вторая секция уже была посещена, и пропускает ее.

Интересно, что проблема проявляется только с горизонтальными UICollectionViews. Почему? Потому что горизонтальные коллекции имеют более сложную навигационную логику - элементы внутри них могут фокусироваться как по горизонтали, так и по вертикали. Вертикальный UICollectionView в третьей секции, вероятно, не вызывает таких проблем, так как его навигация более предсказуема.


Причины предупреждения “already-visited container”

Предупреждение “Ignoring attempt to add focus items in already-visited container” говорит о том, что система фокуса tvOS 26.3 предотвращает потенциальную бесконечную рекурсию. Но что это значит на практике?

Представьте себе ситуацию:

  1. Фокус переходит из Секции 1 в Секцию 2
  2. Пользователь нажимает кнопку “Назад”
  3. Система фокуса пытается вернуться в Секцию 1
  4. Но система считает, что контейнер Секции 2 уже был посещен
  5. Чтобы избежать повторного входа в этот контейнер, она пропускает Секцию 2 и переходит сразу к Секции 1

Это изменение в поведении системы фокуса tvOS 26.3 по сравнению с tvOS 18.5. Apple явно усилила защиту от рекурсивных циклов в навигации, но, похоже, переусердствала в некоторых сценариях.

Кстати, в tvOS-разработке часто сталкиваются с такими тонкими изменениями в поведении фокуса, особенно при работе с вложенными коллекциями. Это одна из тех вещей, которые могут сломаться после обновления ОС, хотя код не менялся.


Структура UI и изменения в движке фокуса

Ваша структура UI с UITableView, содержащим три секции с UICollectionViews, представляет собой сложный сценарий для системы фокуса. Давайте разберем, что происходит под капотом:

UITableView (основной контейнер)
├── Секция 1UITableViewCellUICollectionView (горизонтальный)
├── Секция 2UITableViewCellUICollectionView (горизонтальный) 
└── Секция 3UITableViewCellUICollectionView (вертикальный)

В tvOS 18.5 система фокуса обрабатывала каждый UICollectionView как отдельный “фокус-группу” с независимой историей навигации. Но в tvOS 26.3 система стала более строгой в обработке уже посещенных контейнеров.

Горизонтальные UICollectionViews особенно подвержены этой проблеме, потому что:

  1. Они содержат множество элементов в одном направлении
  2. Имеют более сложную навигационную логику
  3. Могут создавать циклы при неправильной обработке

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

Интересный момент - это не проблема самого UICollectionView или UITableViewCell, а именно изменений в движке фокуса tvOS 26.3. Если бы вы использовали UICollectionView вне UITableView, проблем бы, скорее всего, не возникло.


Решения и обходные пути для проблемы навигации

Хотя официального решения пока нет, есть несколько подходов, которые могут помочь решить проблему фокуса в tvOS 26.3:

1. Настройка behaviorForFocusEnvironment

Попробуйте явно указать поведение фокуса для ваших UICollectionViews:

swift
override func collectionView(_ collectionView: UICollectionView, 
 canFocusItemAt indexPath: IndexPath) -> Bool {
 // В tvOS 26.3 может потребоваться дополнительная логика
 return true
}

override func collectionView(_ collectionView: UICollectionView, 
 shouldUpdateFocusIn context: UIFocusUpdateContext) -> Bool {
 // Проверяем, что контекст не вызывает рекурсии
 guard let nextView = context.nextView else { return false }
 return nextView != collectionView
}

2. Изменение порядка навигации

Иногда помогает явная настройка порядка фокусировки:

swift
collectionView.focusGroupIdentifier = "unique_collection_id"

3. Кастомный Focus Coordinator

Создайте кастомный класс для управления фокусом:

swift
class CustomFocusCoordinator: NSObject {
 static let shared = CustomFocusCoordinator()
 
 func handleFocusNavigation(current: UIView, next: UIView) -> Bool {
 // Логика предотвращения пропусков секций
 return true
 }
}

4. Обходное решение с временным отключением фокуса

Если ничего не помогает, можно временно отключать фокус при определенных условиях:

swift
override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
 super.didUpdateFocus(in: context, with: coordinator)
 
 // Временное решение для tvOS 26.3
 if #available(tvOS 26.3, *) {
 // Логика предотвращения пропусков
 }
}

Важно помнить, что это обходные пути, а не полноценные решения. Они могут перестать работать в будущих версиях tvOS.


Рекомендации по совместимости с разными версиями tvOS

Поскольку проблема возникает только в tvOS 26.3, важно обеспечить совместимость с разными версиями ОС:

1. Версионная обработка кода

Используйте доступность для версионной обработки:

swift
if #available(tvOS 26.3, *) {
 // Код для tvOS 26.3
} else {
 // Код для более старых версий
}

2. Тестирование на разных версиях

Обязательно тестируйте приложение на:

  • tvOS 18.5 (где работает)
  • tvOS 26.3 (где проблема)
  • tvOS 26.4 (если доступно)

3. Мониторирование изменений Apple

Следите за обновлениям документации Apple по tvOS Human Interface Guidelines и UIFocus, где могут появиться новые рекомендации.

4. Сообщество разработчиков

Активно участвуйте в обсуждениях на Stack Overflow и других платформах. Как показал вопрос от Pratham Gupta, вы не одиноки в этой проблеме. Коллективный опыт может привести к лучшему решению.

Интересно, что подобные проблемы часто возникают после крупных обновлений tvOS. Apple постоянно улучшает систему фокуса, но эти улучшения иногда ломают существующие реализации.


Заключение

Проблема с пропуском UICollectionView внутри UITableViewCell в tvOS 26.3 является результатом изменений в движке фокуса, которые вызывают предупреждение “already-visited container”. Хотя официального решения пока нет, существуют несколько обходных путей, которые могут помочь временно решить проблему.

Ключевые моменты:

  • Проблема проявляется только при обратной навигации между горизонтальными UICollectionViews
  • Вертикальные UICollectionViews обычно работают корректно
  • Изменения в tvOS 26.3 направлены на предотвращение рекурсивных циклов
  • Важно тестировать на разных версиях tvOS и следить за обновлениями документации

Рекомендуется активно участвовать в обсуждениях и сообщать о проблеме в Apple через Feedback Assistant. Возможно, в будущих обновлениях tvOS эта регрессия будет исправлена.

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


Источники

  1. Stack Overflow Question — Вопрос о проблеме фокуса в tvOS 26.3: https://stackoverflow.com/questions/79910761/tvos-26-3-focus-skips-uicollectionview-inside-uitableviewcell-with-warning-alr
  2. Apple Developer Documentation — Руководство по UI Focus для tvOS: https://developer.apple.com/documentation/uikit/uifocus
  3. Apple Human Interface Guidelines — Принципы навигации для tvOS: https://developer.apple.com/tvos/human-interface-guidelines/visual-design/focus-and-selection
  4. Stack Overflow Community — Обсуждения по tvOS-разработке: https://stackoverflow.com/questions/tagged/tvos
  5. Apple Developer Forums — Официальный форум поддержки разработчиков: https://developer.apple.com/forums/tvos-developers
P

На данный момент на этот вопрос на Stack Overflow нет ответов. Пользователь столкнулся с проблемой, где фокус в tvOS 26.3 пропускает UICollectionView внутри UITableViewCell при движении назад, сопровождаясь предупреждением “already-visited container”. Проблема проявляется только в tvOS 26.3, тогда как на tvOS 18.5 код работает корректно. Требуется дальнейший поиск решений или ожидание ответов от сообщества разработчиков.

Авторы
P
Разработчик
Источники
Stack Overflow / Q&A Platform
Q&A Platform
Проверено модерацией
НейроОтветы
Модерация