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