Как отложить внешний вид и функциональность UINavigationController для дочернего UIViewController - PullRequest
0 голосов
/ 09 июля 2019

Я создаю оболочку для UIViewControllers, которая добавляет некоторые улучшения в мои контроллеры. Эти упакованные ViewControllers будут помещены в стек навигации UINavtigationController. Контроллеры могут быть вставлены с или без упаковки.

MVP установки будет выглядеть так

enter image description here

Проблема заключается в том, что 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 каждый раз, когда я реализую новый, другими словами, как я могу делегировать все элементы навигации на дочерний вид обертки?

...