2016-09-07 2 views
0

UInavigationController를 전달하고 변수를 새 viewController에 전달하는 가장 좋은 방법은 무엇입니까? 나는 하나 또는 다른 것을하는 방법을 알고 있지만 동시에 둘 다를 할 수는 없습니다. 사전에 감사하는이 당신의 탐색 컨트롤러의 루트 뷰 컨트롤러에 값을 전달하려면 내 현재 코드Swift - UInavigationController를 전달하고 변수를 전달하는 방법

func(){ 

     let vc = storyboard?.instantiateViewControllerWithIdentifier("messagesViewController") as! UINavigationController 
     let posts = self.postList[indexPath.row] 

     //this is the var that i want to past 
     //vc.previousViewMessageId = posts.postKey 

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


} 

답변

0

가, 두 번째 VC를 제공 할 수있는 뷰 컨트롤러가 다음 previousViewMessageId 속성)를 가지고있다. 그리고이 VC는 UINavigationController에 내장되어 있습니다. 어떻게 해야할지 모르겠지만 첫 번째 VC에서 내비게이션 컨트롤러로 데이터를 전달한 다음 두 번째 VC로 데이터를 전달하는 것입니다.

여기에는 강력한 솔루션이 있습니다. 그것은 아름답 지 않지만 어쨌든 작동합니다.

자신의 UINavigationController 서브 클래스 확인 :

class DataPasserController: UINavigationController { 
    var previousViewMessageId: SomeType? 
    override func viewDidLoad() { 
     if let vc = self.topViewController as? YourSecondViewController { 
      vc.previousViewMessageId = self.previousViewMessageId 
     } 
    } 
} 

은 이제 스토리 보드에 네비게이션 컨트롤러를 추가 할 수 있습니다, DataPasserController에 해당 클래스를 설정하고 루트 뷰 컨트롤러로에 두 번째 VC를 연결합니다.

yourDataPasserControllerInstance.previousViewMessageId = posts.postKey 

을 그리고 인스턴스를 제시 :

지금 당신이 instantiateViewControllerWithIdentifier를 호출하여 DataPasserController의 인스턴스를 가지고 가정, 당신은이 작업을 수행 할 수 있습니다!

+0

사과가 "self"안에 UINavigationController를 삽입하지 못하도록합니다. 나는 일반적으로보기를 사용하여 내비게이션을 만들지 만, "자기 내부"에 배치하는 것이 훨씬 쉽습니다. – pprevalon

+0

@pprevalon 질문을 이해하지 못합니다. 스토리 보드의 탐색 컨트롤러에 VC를 내장 할 수 있습니까? 그렇습니다. – Sweeper

+0

좋은 아이디어입니다. 때로는 간단한 것을 간과합니다. – pprevalon

0

입니다

, 당신은 viewControllers[0]에 액세스하고 메시지의 클래스에 캐스팅보기 컨트롤러 (컨트롤러가 내가 제대로 이해하면

func() { 
    let messagesNC = storyboard?.instantiateViewControllerWithIdentifier("messagesViewController") as! UINavigationController 
    let messagesVC = messagesNC.viewControllers.first as! MessagesViewController 

    messagesVC.previousViewMessageId = postList[indexPath.row].postKey 

    presentViewController(messagesNC, animated: true, completion: nil) 
} 
0

당신이 가진 것은 단순히보기 컨트롤러를 제시하는 것입니다 ... 당신은 탐색 컨트롤러를 건너 뜁니다.

당신이해야 할 일은 내비게이션 컨트롤러 안에 새로운보기 컨트롤러를 제시하는 것입니다. 일단 그렇게하면 올바르게 표시됩니다. vc 변수를 만든 후에 변수를 전달할 수도 있습니다. 이 새의 ViewController의 변수 (vc) (당신이 올바른지) 그래서

vc.previousViewMessageId = posts.postKey 

을 설정

self.navigationController?.pushViewController(vc, animated: false) 

이 탐색 컨트롤러 내에서 새의 ViewController (vc)를 제공합니다 ... 완료 :

func(){ 

    let vc = storyboard?.instantiateViewControllerWithIdentifier("messagesViewController") as! MessagesViewController 
    let posts = self.postList[indexPath.row] 

    //this is the var that i want to past 
    vc.previousViewMessageId = posts.postKey 

    navigationController?.pushViewController(vc, animated: false) 
} 

ps. 질문의 일부가 아니지만, 나는 아직도 언급해야한다고 생각합니다 ... 단어 self의 사용은 필연적으로 만 남겨 두어야합니다. 즉, 필요하지 않을 때 사용하지 마십시오. 예 : self.postList[indexPath.row] :) https://github.com/raywenderlich/swift-style-guide#use-of-self

관련 문제