2017-09-02 14 views
0

私のUIBarButtonItemsはクリックに全く反応していないようです。UINavigationBarのUIBarButtonItemsはクローズ不可能です

私は、TableViewControllerに添付されたパンジェスチャ認識機能を持っていますが、panGestureRecognizer.cancelsTouchesInViewからfalseを有効にした後でこれをブロックしていないことを確認しています。

は は

は今、私はビューコントローラアウトスライドを管理するために作成ContainerViewControllerに埋め込まれているナビゲーションコントローラは、以下に含ま :

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

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のタッチはまだ登録されており、それはUINavigationBarの中にちょうどUIBarButtonItemsのようだ。

私は二重のすべてのコンセントが接続されていることを確認し、そして今、他のソリューションを探すのに苦労しています...

は、事前にありがとう!

EDIT:別のUINavigationControllerからにsegue'dとき<Back矢印がの最上部に表示されないように、私は私が埋め込まれた絵コンテUINavigationControllerを削除する場合は、しかし、私はそこにそれを必要とするボタンが仕事を得ることができますNavigationController。

答えて

0

containerviewcontrollernavigationcontrollerと競合しており、単にナビゲーションスタックにプッシュされるのではなく、独自のものであることを宣言する必要があったため、ソリューションはモーダルセグを使用してViewControllerにセグメンテーションすることでした。

関連する問題