2016-11-21 96 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。

相关问题