[英]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.