2016-09-07 30 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視圖控制器。這個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連接到它作爲其根視圖控制器。

現在假設你已經通過調用instantiateViewControllerWithIdentifier得到了DataPasserController一個實例,你可以這樣做:

yourDataPasserControllerInstance.previousViewMessageId = posts.postKey 

和現在的情況!

+0

難道蘋果不允許將UINavigationController嵌入到「自我」中。我通常使用視圖創建自己的導航,但將其嵌入「自我」中會更容易。 – pprevalon

+0

@pprevalon我不太明白你的問題。你可以在故事板中的導航控制器中嵌入一個VC,不是嗎? – Sweeper

+0

這是一個好主意,有時我們忽略了簡單的事情。 – pprevalon

0

的值傳遞給您的導航控制器的根視圖控制器,您可以訪問viewControllers[0],並把它轉換到類郵件的視圖控制器(該控制器有previousViewMessageId屬性):

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)...

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

這臺新的viewController(vc)變量(你是正確的)

vc.previousViewMessageId = posts.postKey 

所以完成:

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