2017-10-19 25 views
1

j'ai fait une sous-classe de UINavigationBar qui override:sur mesure UINavigationBar: pushItem pas appelé iOS précédent

func pushItem(_ item: UINavigationItem, animated: Bool) { 

Quand je pousse mon premier viewController sur mon NavigationController la fonction de get appelé correctement sur iOS11. Cependant, il n'est pas appelé du tout sur iOS10 et moins.

Y a-t-il quelque chose qui a changé dans iOS11 de la façon dont pushItem s'appelle?

Merci pour l'aide

Répondre

0

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.