2017-05-22 14 views
0

내가 뭘 하려는지, 이전의 모든보기 컨트롤러를 스택에서 '메뉴'컨트롤러까지 팝하는 것입니다. 그 일을해야하는 코드가 있지만 '메뉴'를 클릭하면 앱이 다운됩니다.popToViewController를 올바르게 사용하는 방법은 무엇입니까?

크래시의 이유 : '존재하지 않는보기 컨트롤러에 팝업하려고했습니다.' 필요하다면 나는 기꺼이 더 많은 코드/정보를 제공합니다

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 

    // 0 = menu 
    if indexPath.row == 0 { 
     let vcName = identities[indexPath.row] 
     let viewController = storyboard?.instantiateViewController(withIdentifier: vcName) 
     let _ = navigationController?.popToViewController(viewController!, animated: true) 

    } else { 

     let vcName = identities[indexPath.row] 
     let viewController = storyboard?.instantiateViewController(withIdentifier: vcName) 
     self.navigationController?.pushViewController(viewController!, animated: true) 
    } 
} 

: 여기

내 코드의 일부입니다.

도움을 주시면 감사하겠습니다.

답변

3

팝업하려고하는보기 컨트롤러의 새 인스턴스을 인스턴스화 할 수 없습니다. 탐색 스택에있는 실제 인스턴스으로 이동해야합니다.

메뉴가 내비게이션 스택의 루트 인 경우 popToRootViewController을 사용할 수 있습니다. 다른 곳의 스택에 있다면 참조를 유지하거나 탐색 컨트롤러의 viewControllers 배열을 반복하여 찾아서 팝업 할 수 있습니다.

if let navController = self.navigationController { 
    for controller in navController.viewControllers { 
     if controller is MenuController { // Change to suit your menu view controller subclass 
      navController.popToViewController(controller, animated:true) 
      break 
     } 
    } 
} 
+0

스택에있는 다른 곳 (루트가 아님)에 코드에있는 참조를 사용하여 액세스하는 방법을 보여줄 수 있습니까? 내가 가지고있는 질문의 양을 최소화하기 위해서. –

+0

감사! 나는 그 일을 완벽하게 수행했습니다. 쉽게 구현할 수 있습니다. –