2016-11-21 100 views
1

我有一個MapViewControllerprepareForSegue(_:sender:)方法,我打算用它來發送數據到LandmarkTableViewController,並在按下按鈕時調用。通過segue在視圖控制器之間傳遞數據

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     let destinationvc = segue.destinationViewController 
     if let landmarkvc = destinationvc as? LandmarkTableViewController { 
      if let identifier = segue.identifier { 

       let library = Landmark(name: "Run Run Shaw Library", properties: ["Chinese Kanji", "Gray", "Green Plants"]) 

       let bank = Landmark(name: "Hang Seng Bank", properties: ["Chinese Kanji", "Green"]) 

       switch identifier { 
        case "showLibrary" : landmarkvc.passedLandmark = library // pass data to LandmarkTableViewController 
        case "showBank" : landmarkvc.passedLandmark = bank // pass data to LandmarkTableViewController 
        default : break 
       } 
      } 
     } 
    } 

LandmarkTableViewController的正確設置了顯示字符串數組properties,對每行一個字符串。所以我打算做的是根據按下哪個按鈕,將適當的表格數據傳遞給properties,並讓LandmarkTableViewController顯示相應的properties

class LandmarkTableViewController: UITableViewController { 
    var properties = [String]() 
    var passedLandmark = Landmark(name: "temp", properties: ["temp"]) // initially set to default value 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     loadSampleProperties() 
    } 

    func loadSampleProperties() { 
     self.properties = passedLandmark!.properties 
    } 
    // other methods.... 
} 

class Landmark { 
    var name: String 
    var properties: [String] 

    init?(name: String, properties: [String]) { 
     self.name = name 
     self.properties = properties 

     // Initialization should fail if there is no name or if there is no property. 
     if name.isEmpty || properties.isEmpty { 
      return nil 
     } 
    } 

然而,當我運行該代碼,只有溫度顯示在表視圖。我一直堅持這個很長一段時間,所以任何幫助非常感謝!

編輯: loadData()viewDidLoad中的()內被改變到正確loadSampleProperties()。我在發佈問題代碼時犯了一個錯誤。

+1

你確定你的目標視圖控制器是一個LandmarkTableViewController(它可能是導航控制器的根視圖控制器是一個LandmarkTableViewController)嗎?你的遊戲是否設置了「showLibrary」和「showBank」標識符?另外,你是否在某處調用loadSampleProperties()方法?設置屬性後是否重新加載表格數據? – albertamg

+0

@albertamg我剛剛注意到了你指出的內容:LandmarkTableViewController的目標視圖控制器確實是一個導航控制器,它的根視圖控制器是一個LandmarkTableViewController。你知道我如何解決這個問題嗎?因爲我還沒有任何想法。 –

+0

然後在'prepareForSegue()'像這樣訪問你的'LandmarkTableViewController':'if let navController = segue.destinationViewController as? UINavigationController,讓landmarkVC = navController.viewControllers [0]爲? LandmarkTableViewController {// ...} – albertamg

回答

0

我想這應該解決您的問題,如果不仔細檢查您的標識符 ,你可以確保與添加打印(passedLandmark)到viewDidLoad中()或斷點傳遞數據,以確保您獲得數據

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)  { 
    let destinationvc = segue.destinationViewController 
    if let landmarkvc = destinationvc as? LandmarkTableViewController { 
     if segue.identifier == "showLibrary" { 

      let library = Landmark(name: "Run Run Shaw Library", properties: ["Chinese Kanji", "Gray", "Green Plants"]) 
       landmarkvc.passedLandmark = library 
     } 
     if segue.identifier == "showBank" { 
      let bank = Landmark(name: "Hang Seng Bank", properties: ["Chinese Kanji", "Green"]) 
      landmarkvc.passedLandmark = bank 
     } 
    } 
} 

希望這會有所幫助

0

代碼從您的報價中缺失,所以我不能確定,但​​我認爲您的loadData()方法是重新加載表格視圖數據並將Landmark傳遞給prepareForSegue 。如果是這樣的話:

viewDidLoad中()之前 prepareForSegue被稱爲,使destinationViewController的所有意見和元件裝入並準備使用。因此,在你的情況下,表格視圖加載了你的「臨時」數據,當你設置正確的數據時沒有任何東西使它重新加載。

有兩種選擇: 您可以在viewWillAppear中調用loadData()/ reloadData(),例如在prepareForSegue()之後調用它。不要忘記,viewWillAppear可能會在其他導航中再次被調用。 否則,您可以在父視圖控制器中實例化並呈現/推送新控制器,而不是使用segue。

相關問題