Il semble être un issue connu. Pour contourner ce problème, je me suis retrouvé avec l'implémentation de NavigationController personnalisé à utiliser avec NavigationBar. Tant que je peux voir seulement pushViewController et popToRootViewController ne fonctionnent pas comme prévu. Ainsi, le code ci-dessous couvre tous les cas de navigation pour iOS 10.
NavigationBar.swift:
final class NavigationBar: UINavigationBar {
override func pushItem(_ item: UINavigationItem, animated: Bool) {
return transit(to: item, isNewItem: true, animated: animated) {
super.pushItem(item, animated: animated)
}
}
override func popItem(animated: Bool) -> UINavigationItem? {
return transit(to: backItem, isNewItem: false, animated: animated) {
super.popItem(animated: animated)
}
}
override func setItems(_ items: [UINavigationItem]?, animated: Bool) {
let isNewItem = items?.last
.flatMap {self.items?.contains($0)}
.map {!$0}
?? true
return transit(to: items?.last, isNewItem: isNewItem, animated: animated) {
super.setItems(items, animated: animated)
}
}
func transit<T>(to item: UINavigationItem?, isNewItem: Bool, animated: Bool, action:() -> T) -> T {
CATransaction.begin(); defer {CATransaction.commit()}
CATransaction.setDisableActions(!animated)
doSomeCoolAnimatedStuff(isNewItem)
return action()
}
}
NavigationController.swift:
final class NavigationController: UINavigationController {
private var baforeIos11: Bool {if #available(iOS 11.0, *) {return false} else {return true}}
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
guard let bar = navigationBar as? NavigationBar, baforeIos11 else {
return super.pushViewController(viewController, animated: animated)
}
return bar.transit(to: viewController.navigationItem, isNewItem: true, animated: true) {
super.pushViewController(viewController, animated: animated)
}
}
override func popToRootViewController(animated: Bool) -> [UIViewController]? {
guard let bar = navigationBar as? NavigationBar else {
return super.popToRootViewController(animated: animated)
}
return bar.transit(to: viewControllers.first?.navigationItem, isNewItem: false, animated: true) {
super.popToRootViewController(animated: animated)
}
}
}
J'ai aussi essayé de mettre délégué NavigationBar à l'auto mais il interrompt le processus de navigation, ce qui fait que les contrôleurs de vue ne sont pas affichés.