tvOS 26.3: Фокус пропускает UICollectionView внутри UITableViewCell
Проблема навигации фокуса в tvOS 26.3: UICollectionView пропускает секции при движении назад с предупреждением 'already-visited container'.
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
- Причины предупреждения “already-visited container”
- Структура UI и изменения в движке фокуса
- Решения и обходные пути для проблемы навигации
- Рекомендации по совместимости с разными версиями tvOS
- Заключение
Анализ проблемы фокуса в 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 в Секцию 2
- Пользователь нажимает кнопку “Назад”
- Система фокуса пытается вернуться в Секцию 1
- Но система считает, что контейнер Секции 2 уже был посещен
- Чтобы избежать повторного входа в этот контейнер, она пропускает Секцию 2 и переходит сразу к Секции 1
Это изменение в поведении системы фокуса tvOS 26.3 по сравнению с tvOS 18.5. Apple явно усилила защиту от рекурсивных циклов в навигации, но, похоже, переусердствала в некоторых сценариях.
Кстати, в tvOS-разработке часто сталкиваются с такими тонкими изменениями в поведении фокуса, особенно при работе с вложенными коллекциями. Это одна из тех вещей, которые могут сломаться после обновления ОС, хотя код не менялся.
Структура UI и изменения в движке фокуса
Ваша структура UI с UITableView, содержащим три секции с UICollectionViews, представляет собой сложный сценарий для системы фокуса. Давайте разберем, что происходит под капотом:
UITableView (основной контейнер)
├── Секция 1 → UITableViewCell → UICollectionView (горизонтальный)
├── Секция 2 → UITableViewCell → UICollectionView (горизонтальный)
└── Секция 3 → UITableViewCell → UICollectionView (вертикальный)
В tvOS 18.5 система фокуса обрабатывала каждый UICollectionView как отдельный “фокус-группу” с независимой историей навигации. Но в tvOS 26.3 система стала более строгой в обработке уже посещенных контейнеров.
Горизонтальные UICollectionViews особенно подвержены этой проблеме, потому что:
- Они содержат множество элементов в одном направлении
- Имеют более сложную навигационную логику
- Могут создавать циклы при неправильной обработке
Вертикальный UICollectionView в третьей секции работает корректно, вероятно, потому что его навигация более линейная и предсказуемая для системы фокуса.
Интересный момент - это не проблема самого UICollectionView или UITableViewCell, а именно изменений в движке фокуса tvOS 26.3. Если бы вы использовали UICollectionView вне UITableView, проблем бы, скорее всего, не возникло.
Решения и обходные пути для проблемы навигации
Хотя официального решения пока нет, есть несколько подходов, которые могут помочь решить проблему фокуса в tvOS 26.3:
1. Настройка behaviorForFocusEnvironment
Попробуйте явно указать поведение фокуса для ваших UICollectionViews:
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. Изменение порядка навигации
Иногда помогает явная настройка порядка фокусировки:
collectionView.focusGroupIdentifier = "unique_collection_id"
3. Кастомный Focus Coordinator
Создайте кастомный класс для управления фокусом:
class CustomFocusCoordinator: NSObject {
static let shared = CustomFocusCoordinator()
func handleFocusNavigation(current: UIView, next: UIView) -> Bool {
// Логика предотвращения пропусков секций
return true
}
}
4. Обходное решение с временным отключением фокуса
Если ничего не помогает, можно временно отключать фокус при определенных условиях:
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. Версионная обработка кода
Используйте доступность для версионной обработки:
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 эта регрессия будет исправлена.
В любом случае, это не критическая проблема, а скорее побочный эффект улучшений в системе фокуса. С правильной обработкой можно обеспечить корректную навигацию даже в текущих условиях.
Источники
- Stack Overflow Question — Вопрос о проблеме фокуса в tvOS 26.3: https://stackoverflow.com/questions/79910761/tvos-26-3-focus-skips-uicollectionview-inside-uitableviewcell-with-warning-alr
- Apple Developer Documentation — Руководство по UI Focus для tvOS: https://developer.apple.com/documentation/uikit/uifocus
- Apple Human Interface Guidelines — Принципы навигации для tvOS: https://developer.apple.com/tvos/human-interface-guidelines/visual-design/focus-and-selection
- Stack Overflow Community — Обсуждения по tvOS-разработке: https://stackoverflow.com/questions/tagged/tvos
- Apple Developer Forums — Официальный форум поддержки разработчиков: https://developer.apple.com/forums/tvos-developers
На данный момент на этот вопрос на Stack Overflow нет ответов. Пользователь столкнулся с проблемой, где фокус в tvOS 26.3 пропускает UICollectionView внутри UITableViewCell при движении назад, сопровождаясь предупреждением “already-visited container”. Проблема проявляется только в tvOS 26.3, тогда как на tvOS 18.5 код работает корректно. Требуется дальнейший поиск решений или ожидание ответов от сообщества разработчиков.
