2016-11-21 4 views
1

У меня есть MapViewController с методом prepareForSegue(_: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»)? Есть ли у ваших segues набор «showLibrary» и «showBank»? Кроме того, вы вызываете 'loadSampleProperties()' где-нибудь? Обновляете ли вы данные таблицы после установки свойств? – albertamg

+0

@albertamg Я только что заметил то, что вы указали: Контроллер представления назначения «LandmarkTableViewController» - это действительно контроллер навигации, контроллер корневого представления которого является «LandmarkTableViewController». Знаете ли вы, как я решаю эту проблему? Потому что я до сих пор не знаю. –

+0

Затем в 'prepareForSegue()' обращайтесь к вашему 'LandmarkTableViewController' следующим образом:' if let navController = segue.destinationViewController as? UINavigationController, let landmarkVC = navController.viewControllers [0] as? 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, так что все представления и элементы целевогоViewController загружены и готовы к использованию. Таким образом, в вашем случае табличное представление загружается вашими «временными» данными, и ничто не перезагружает его, когда вы устанавливаете правильный.

У вас есть два варианта: Вы можете вызвать loadData()/reloadData() в viewWillAppear, например, который вызывается после prepareForSegue(). Не забывайте, что viewWillAppear, возможно, снова будет вызван в другой навигации. В противном случае вы можете создать экземпляр и представить/нажать новый контроллер в своем родительском контроллере представления, вместо использования segue.

 Смежные вопросы

  • Нет связанных вопросов^_^