我有一个MapViewController
方法,我打算使用prepareForSegue(_:sender:)
方法将数据发送到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
已正确设置为显示字符串数组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
}
}
但是,当我运行代码时,表视图中只显示temp。我已经坚持了很长时间了,所以任何帮助都非常感谢!
编辑: viewDidLoad()内的loadData()更改为正确的loadSampleProperties()。在将问题发布到问题时我犯了一个错误。
答案 0 :(得分:0)
我认为如果不仔细检查您的标识符,这应该可以解决您的问题 并且您可以确保通过向viewDidLoad()或断点添加print(passedLandmark)以确保获取数据来传递数据
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
}
}
}
希望这会有所帮助
答案 1 :(得分:0)
您的引用中缺少代码,因此我无法确定,但我认为您的loadData()方法是使用您在prepareForSegue中传递的Landmark重新加载表视图数据的方法。如果是这样的话:
viewDidLoad()在 prepareForSegue之前被称为,因此destinationViewController的所有视图和元素都已加载并可供使用。因此,在您的情况下,表视图将加载您的“临时”数据,并且当您设置正确的数据时,没有任何内容可以重新加载。
您有两种选择: 例如,您可以在viewWillAppear中调用loadData()/ reloadData(),这在prepareForSegue()之后调用。请记住,viewWillAppear可能会在其他导航中再次被调用。 否则,您可以在父视图控制器中实例化并显示/推送新控制器,而不是使用segue。