Я создаю оболочку для UIViewControllers, которая добавляет некоторые улучшения в мои контроллеры.
Эти упакованные ViewControllers будут помещены в стек навигации UINavtigationController. Контроллеры могут быть вставлены с или без упаковки.
MVP установки будет выглядеть так
Проблема заключается в том, что UINavigationController всегда использует ближайшего дочернего элемента для управления такими вещами, как title, navigationItem и другие. Я хочу передать эту функциональность ребенку, чтобы ребенок не знал об этом.
Исправить заголовок можно легко, добавив что-то вроде title = child.title
в оболочку. Доступ к элементу navigationController самостоятельно из дочернего / contentView также прост, так как navigationController?
поднимается вверх по стеку, когда находит первый навигационный контроллер.
Однако, когда дело доходит до добавления элементов навигации, у меня возникают проблемы. Поскольку я не могу просто установить navigationItem = child.navigationItem
, поскольку он только для чтения.
Прямо сейчас я делаю это, что похоже на хак и абсолютно не соответствует моему требованию о том, что contentView не осознает, что оно было упаковано.
let viewController = parent?.parent as? WrapperViewController ?? self
viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "push me", style: .plain, target: nil, action: nil)
Как я могу сделать надежную реализацию этого, которая «просто работает», не думая о возможности переноса viewController каждый раз, когда я реализую новый, другими словами, как я могу делегировать все элементы навигации на дочерний вид обертки?