簡體   English   中英

通過segue在視圖控制器之間傳遞數據

[英]Passing data between view controllers through segue

我有一個帶有prepareForSegue(_:sender:)方法的MapViewController ,我打算用它將數據發送到LandmarkTableViewController ,並在按下按鈕時調用。

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已正確設置為顯示String數組properties ,每行包含一個String。 所以我打算做的是根據按下的按鈕將表的相應數據傳遞給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
        }
    }

但是,當我運行代碼時,表視圖中只顯示temp。 我已經堅持了很久了,所以任何幫助都非常感謝!

編輯: viewDidLoad()內的loadData()更改為正確的loadSampleProperties()。 在將問題發布到問題時我犯了一個錯誤。

我認為這應該可以解決您的問題,如果不仔細檢查您的標識符,您可以確保數據傳遞與添加print(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
        }
    }
}

希望這會有所幫助

您的引用中缺少代碼,因此我無法確定,但我認為您的loadData()方法是使用您在prepareForSegue中傳遞的Landmark重新加載表視圖數據的方法。 如果是這種情況:

prepareForSegue 之前調用viewDidLoad(),以便加載並准備好使用destinationViewController的所有視圖和元素。 因此,在您的情況下,表視圖加載了您的“臨時”數據,當您設置正確的數據時,沒有任何東西可以重新加載。

您有兩個選擇:例如,您可以在viewWillAppear中調用loadData()/ reloadData(),這在prepareForSegue()之后調用。 請記住,viewWillAppear可能會在其他導航中再次被調用。 否則,您可以在父視圖控制器中實例化並顯示/推送新控制器,而不是使用segue。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM