2016-07-05 5 views
1

두 개의보기 컨트롤러간에 변경하고 싶습니다. 두 ViewController는 모두 CenterViewController에서 상속받습니다. 아래의 코드는 스택에 하나 개의 ViewController (CertificatenViewController)를 추가하는 것입니다ViewController 바꾸기

centerViewController = CertificatenViewController(nibName: "CertificatenViewController", bundle: nil) 
    centerViewController.delegate = self 
centerNavigationController = UINavigationController(rootViewController: centerViewController) 
    view.addSubview(centerNavigationController.view) 
    addChildViewController(centerNavigationController) 

    centerNavigationController.didMoveToParentViewController(self) 

이가있는 viewDidLoad에서 일어나는과 같은 클래스에 내가보기로드되어야하는 확인하는 switch 문이, 이런 식으로 뭔가 :

 switch menuItem.getNibname() { 
    case "CertificatenViewController": 
     print(menuItem.getNibname()) 

     centerViewController = CertificatenViewController(nibName: menuItem.getNibname(), bundle: nil) 
     centerViewController.delegate = self 

    case "SettingsViewController": 
     print(menuItem.getNibname()) 

     centerViewController = SettingsViewController(nibName: menuItem.getNibname(), bundle: nil) 
     centerViewController.delegate = self  

    default: break 

    } 

정확히 어떤 문제인지는 모르겠지만보기가 다시로드되지 않는 것으로 보입니다. 나는 popViewControllerAnimated 시도했지만이 작동하지 않습니다. 이 문제를 해결할 수 있도록 도와주세요.

는 해결 방법 :

view.addSubview(centerNavigationController.view) 
addChildViewController(centerNavigationController) 

centerNavigationController.didMoveToParentViewController(self) 

그냥 그 코드를 제거 :

func changeView(menuItem: MenuItem){ 

    self.centerNavigationController.viewControllers.removeAll() 


    switch menuItem.getNibname() { 
    case "CertificatenViewController": 
     print(menuItem.getNibname()) 

     self.centerNavigationController.pushViewController(self.centerViewController, animated: false) 

    case "SettingsViewController": 
     print(menuItem.getNibname()) 

     self.centerNavigationController.pushViewController(self.settingsViewController, animated: false) 

    case "MessagesViewController": 
     print(menuItem.getNibname()) 

     self.centerNavigationController.pushViewController(self.messagesViewController, animated: false) 

    default: break 

    } 

} 
+0

두 개의 View Controller간에 ** 변경 **이란 무엇을 의미합니까? 다음 뷰 컨트롤러를 밀거나 모달로 표시하려는 경우 올바르지 않은 작업입니다. 아래의 해답은 View Controller를 표현하는 방법을 보여줍니다. –

답변

2

일반적으로,이 뷰 컨트롤러를 제시하는 방법이 아니다.

나는 당신이 일을하려고 정확히 잘 모르겠지만, 뭔가

self.presentViewController(centerNavigationController, animated: true, complettion: nil) 

같은 것은 일반적입니다. 이렇게하면 현재보기 컨트롤러가 탐색 컨트롤러를 표시합니다 (일반적으로 그 자체 위에 표시). 그런 다음 nav-controller가 자신의 내부에 설정 한 루트를 표시합니다 (따라서 centerViewController).

제거하려면 프리젠 테이션을 한보기 컨트롤러 인스턴스에서 dismissViewControllerAnimated:completion:으로 전화하십시오.

centerViewController = CertificatenViewController(nibName: menuItem.getNibname(), bundle: nil) 
    centerViewController.delegate = self 

추가 :

centerNavigationController.setViewControllers([centerViewController], animated: true) 
0

@Lou 당신이 할 경우, 교체 할 때,

나중에 탐색 컨트롤러 (네비게이션 컨트롤러에 기각 호출하지 않습니다)를 일축 프랑코

답장을 보내 주셔서 감사합니다. 제발 중복 코드에 신경 쓰지 마라. 나는 나중에 그것을 없앤다. 이것은 지금 내 해결책입니다 :

override func viewDidLoad() { 
    super.viewDidLoad() 

    centerViewController = CertificatenViewController(nibName: "CertificatenViewController", bundle: nil) 
    centerViewController.delegate = self 

    // wrap the centerViewController in a navigation controller, so we can push views to it 
    // and display bar button items in the navigation bar 
    centerNavigationController = UINavigationController(rootViewController: centerViewController) 

    self.presentViewController(centerNavigationController, animated: true, completion: nil) 

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

} 

func changeView(menuItem: MenuItem){ 


    switch menuItem.getNibname() { 
    case "CertificatenViewController": 
     print(menuItem.getNibname()) 

     centerViewController = CertificatenViewController(nibName: menuItem.getNibname(), bundle: nil) 
     centerViewController.delegate = self 

     // wrap the centerViewController in a navigation controller, so we can push views to it 
     // and display bar button items in the navigation bar 
     centerNavigationController = UINavigationController(rootViewController: centerViewController) 

     centerNavigationController.setViewControllers([centerViewController], animated: true) 
     self.presentViewController(centerNavigationController, animated: true, completion: nil) 

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


    case "SettingsViewController": 
     print(menuItem.getNibname()) 

     centerViewController = SettingsViewController(nibName: menuItem.getNibname(), bundle: nil) 
     centerViewController.delegate = self 

     // wrap the centerViewController in a navigation controller, so we can push views to it 
     // and display bar button items in the navigation bar 
     centerNavigationController = UINavigationController(rootViewController: centerViewController) 

     centerNavigationController.setViewControllers([centerViewController], animated: true) 
     self.presentViewController(centerNavigationController, animated: true, completion: nil) 


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

    default: break 

    } 
} 

하지만 지금 다음과 같은 오류와 검은 화면이 나타납니다.

Certificaten365[4108:1731299] Warning: Attempt to present <UINavigationController: 0x130014000> on 
<Certificaten365.ContainerViewController: 0x12fe3dde0> whose view is not in the window hierarchy! 
+0

해결책이 아닌 답변을 작성하지 말고 대신 질문을 편집하여 정보를 업데이트하십시오. –

+0

당신은 현재 화면 상에 있지 않은 viewcontroller에 프리젠 테이션을하고 있습니다 (이것이 오류라고합니다). 내 대답 좀 봐 - 같은 centernavigator 유지하고 해당 viewControllers 다시 설정합니다. 새로운 것을 원한다면 먼저 현재 nav-controller를 닫아야합니다. –

+0

죄송합니다, 새로운 stackoverflow 아시다시피 .. hehe. 내가 제안한대로 두 번째 응답 (viewDidLoad 만)을 업데이트했습니다. 하지만 같은 오류가 발생합니다 : 경고 :보기를 시도합니다.보기가 뷰 계층 구조에 없습니다! – KNV