2017-09-02 3 views
0

Il semble que mes UIBarButtonItems ne répondent pas du tout aux clics.UIBarButtonItems dans UINavigationBar sont unclickable

J'ai un reconnaisseur de mouvement de casserole attaché à un TableViewController, cependant j'ai établi que ceci ne le bloque pas après avoir permis panGestureRecognizer.cancelsTouchesInView à false.

En ce moment, le contrôleur de navigation est intégré dans un ContainerViewController j'ai créé pour gérer une diapositive contrôleur de vue, inclus ci-dessous:

import UIKit 

class InstructorSlideOutContainerViewController: SlideOutContainerViewController { 

var isFromLogin:Bool? 

override func viewDidLoad() { 
    super.viewDidLoad() 
    setLeftViewController(identifier: "InstructorSettingsTableViewController") 
    setCenterViewController(identifier: "InstructorClassesTableViewController") 
    (centerViewController as! InstructorClassesTableViewController).delegate = self 
    (centerViewController as! InstructorClassesTableViewController).touchDelegate = self 
    (centerViewController as! InstructorClassesTableViewController).isFromLogin = isFromLogin 

    centerNavigationController = UINavigationController(rootViewController: centerViewController!) 
    view.addSubview(centerNavigationController.view) 
    addChildViewController(centerNavigationController) 

    centerNavigationController.didMove(toParentViewController: self) 

    let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:))) 
    centerNavigationController.view.addGestureRecognizer(panGestureRecognizer) 
} 

class func getEntrySegueFromFBLogin() -> String { 
    return "FBLoginToInstructorContainerSegue" 
} 

class func getEntrySegueFromLogin() -> String { 
    return "LoginToInstructorContainerSegue" 
} 

class func getEntrySegueFromSignUp() -> String { 
    return "LoginToInstructorContainerSegue" 
} 
} 

Ce qui est une sous-classe de la ContainerViewController généralisée:

enum SlideOutState { 
    case LeftPanelClosed 
    case LeftPanelExpanded 
} 

import UIKit 

protocol SlideOutContainerViewControllerDelegate { 
    func toggleLeftPanel() 
} 

protocol InitializeViewControllers { 
    func setLeftViewController(identifier: String) 
    func setCenterViewController(identifier: String) 
} 

class SlideOutContainerViewController: UIViewController { 

    var centerNavigationController: UINavigationController! 
    var centerViewController: UIViewController? 
    var currentState: SlideOutState = .LeftPanelClosed 
    var leftViewController: UIViewController? 
    var centerViewControllerIdentifer = "" 
    let centerPanelExpandedOffset: CGFloat = 60 
    var mainStoryboard:UIStoryboard? 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main) 
    } 

} 

extension SlideOutContainerViewController: InitializeViewControllers { 

    func setLeftViewController(identifier: String) { 
     leftViewController = mainStoryboard?.instantiateViewController(withIdentifier: identifier) 
    } 

    func setCenterViewController(identifier: String) { 
     centerViewController = mainStoryboard?.instantiateViewController(withIdentifier: identifier) 
    } 
} 

extension SlideOutContainerViewController: SlideOutContainerViewControllerDelegate { 
    func toggleLeftPanel(){ 
     let notAlreadyExpanded = (currentState != .LeftPanelExpanded) 
     if notAlreadyExpanded { 
      addChildSidePanelController(sidePanelController: leftViewController!) 
     } 
     animateLeftPanel(shouldExpand: notAlreadyExpanded) 
    } 

    func addChildSidePanelController(sidePanelController: UIViewController) { 
     view.insertSubview(sidePanelController.view, at: 0) 
     addChildViewController(sidePanelController) 
     sidePanelController.didMove(toParentViewController: self) 
    } 

    func animateLeftPanel(shouldExpand: Bool){ 
     if shouldExpand { 
      currentState = .LeftPanelExpanded 
      animateCenterPanelXPosition(targetPosition: centerNavigationController.view.frame.width - centerPanelExpandedOffset) 
     } else { 
      animateCenterPanelXPosition(targetPosition: 0) {finished in 
       self.currentState = .LeftPanelClosed 
       self.leftViewController?.view.removeFromSuperview() 
      } 
     } 
    } 

    func animateCenterPanelXPosition(targetPosition: CGFloat, completion: ((Bool) -> Void)! = nil) { 
     UIView.animate(withDuration: 0.5, delay: 0.0, options: UIViewAnimationOptions.curveEaseOut, animations: { 
      self.centerNavigationController.view.frame.origin.x = targetPosition 
     }, completion: completion) 
    } 

    func showShadowForCenterViewController(shouldShowShadow: Bool) { 
     if shouldShowShadow { 
      centerNavigationController.view.layer.shadowOpacity = 0.8 
     } else { 
      centerNavigationController.view.layer.shadowOpacity = 0.0 
     } 
    } 
} 

// MARK: Gesture Recognizer 

extension SlideOutContainerViewController { 
    func handlePanGesture(_ recognizer: UIPanGestureRecognizer) -> Void { 
     let gestureIsDraggingFromLeftToRight = recognizer.velocity(in: view).x > 0 

     switch recognizer.state { 
     case .began: 
      if currentState == .LeftPanelClosed { 
       if gestureIsDraggingFromLeftToRight { 
        addChildSidePanelController(sidePanelController: leftViewController!) 
       } 
       showShadowForCenterViewController(shouldShowShadow: true) 
      } 
     case .changed: 
      if gestureIsDraggingFromLeftToRight || currentState == .LeftPanelExpanded { 
       recognizer.view!.center.x = recognizer.view!.center.x + recognizer.translation(in: view).x 
       recognizer.setTranslation(CGPoint.zero, in: view) 
      } 
     case .ended: 
      if leftViewController != nil { 
       let hasMovedMoreThanHalfway = recognizer.view!.center.x > view.bounds.size.width 
       animateLeftPanel(shouldExpand: hasMovedMoreThanHalfway) 
      } 
     default: 
      break 
     } 
    } 
} 

Voici une capture d'écran du storyboard. Donc, fondamentalement, une fois les charges Containerviewcontroller, je ne peux utiliser aucun des boutons de la barre de navigation. Touches dans le TableViewController sont encore enregistrés, il semble que c'est juste le UIBarButtonItems à l'intérieur du UINavigationBar.

Je double vérifié que tous les points de vente sont connectés, et à droite me bats maintenant chercher d'autres solutions ...

Merci d'avance !!

EDIT: Je peux obtenir les boutons pour travailler si je retire le UINavigationController de story-board intégré, mais je besoin là pour que quand segue'd à partir d'un autre UINavigationController la flèche <Back ne montre pas au sommet de la NavigationController.

Répondre

0

La solution était de segue au viewcontroller avec une section modale, parce que le containerviewcontroller était en concurrence avec le navigationcontroller et avait besoin de déclarer son propre au lieu de simplement être poussé sur la pile de navigation.