2017-09-02 44 views
0

看来我的UIBarButtonItems根本没有响应点击。UINavigationBar中的UIBarButtonItems不可点击

我有一个连接到TableViewController的平移手势识别器,但是我确定这不会阻止它启用panGestureRecognizer.cancelsTouchesInViewfalse后。

现在导航控制器被嵌入在我管理出来视图控制器的滑动产生的ContainerViewController,下面包括:

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" 
} 
} 

哪一个是广义ContainerViewController的子类:

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 
     } 
    } 
} 

这是故事板的截图。

picture 所以基本上一旦Containerviewcontroller加载,我不能使用导航栏中的任何按钮。在TableViewController触摸仍然是注册,它似乎只是在UINavigationBarUIBarButtonItems

我仔细检查了所有的出口连接,而现在我在努力寻找其他的解决方案...

预先感谢您!

编辑:我能得到的按钮,如果我删除嵌入的故事板UINavigationController的工作,但是我需要有这样当从其他的UINavigationController segue'd到<Back箭头并不在的顶部显示NavigationController。

回答

0

的解决方案是Segue公司与模态赛格瑞的视图 - 控制,因为containerviewcontroller是与navigationcontroller竞争,并宣布它自己,而不是简单地被推到导航堆栈需要。