2016-11-21 6 views
1

Ich habe eine MapViewController mit einer prepareForSegue(_:sender:) Methode, die ich verwenden möchte, um Daten an LandmarkTableViewController zu senden, und wird aufgerufen, wenn eine Schaltfläche gedrückt wird.Übergeben von Daten zwischen View-Controllern über das Segment

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 
       } 
      } 
     } 
    } 

Die LandmarkTableViewController richtig auf jeder Zeile, um die String-Array properties, mit einer Zeichenfolge anzuzeigen einzurichten. Was ich also vorhabe, ist, die entsprechenden Daten für die Tabelle an properties zu übergeben, je nachdem welche Taste gedrückt wurde, und LandmarkTableViewController die entsprechende properties anzeigen zu lassen.

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 
     } 
    } 

Allerdings, wenn ich den Code ausführen, nur temp in der Tabellenansicht angezeigt. Ich habe mich schon lange daran gehalten, also jede Hilfe wird sehr geschätzt!

Bearbeiten: loadData() innerhalb von viewDidLoad() wird in die richtige loadSampleProperties() geändert. Beim Posten des Codes in der Frage ist ein Fehler aufgetreten.

+1

Sind Sie sicher, dass Ihr Ziel-View-Controller ein "LandmarkTableViewController" ist (es könnte ein Navigations-Controller sein, dessen Root-View-Controller ein "LandmarkTableViewController" ist)? Haben Ihre Segmente die IDs "showLibrary" und "showBank"? Rufen Sie 'loadSampleProperties()' irgendwo auf? Laden Sie Ihre Tabellendaten nach dem Einstellen der Eigenschaften neu? – albertamg

+0

@albertamg Ich habe gerade bemerkt, worauf Sie hingewiesen haben: Der Ziel-View-Controller von 'LandmarkTableViewController' ist in der Tat ein Navigations-Controller, dessen Root-View-Controller ein' LandmarkTableViewController' ist. Weißt du, wie ich dieses Problem löse? Weil ich immer noch keine Ahnung habe. –

+0

Dann in 'prepareForSegue()' greifen Sie auf Ihren 'LandmarkTableViewController' folgendermaßen zu:' Wenn navController = segue.destinationViewController als? UINavigationController, lassen Sie landmarkVC = navController.viewControllers [0] als? LandmarkTableViewController {// ...} ' – albertamg

Antwort

0

ich denke, das Ihr Problem lösen soll, wenn nicht Ihre Identifikatoren verdoppeln überprüfen und Sie können Daten sicher, mit Druck Zugabe vorbei (passedLandmark) zu viewDidLoad() oder Haltepunkt Sie sicher, dass die Daten immer

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 
     } 
    } 
} 
zu machen

0

Code fehlt in Ihrem Angebot, also kann ich nicht sicher sein, aber ich nehme an, Ihre loadData() -Methode lädt die Daten der Tabelle mit Landmark, die Sie in prepareForSegue übergeben haben . Wenn dies der Fall ist:

viewDidLoad() heißt vor prepareForSegue, so dass alle Ansichten und Elemente des destinationViewController geladen und einsatzbereit sind. In Ihrem Fall wird also die Tabellenansicht mit Ihren "temp" -Daten geladen und nichts lädt sie neu, wenn Sie die richtige gesetzt haben.

Sie haben zwei Möglichkeiten: Sie könnten zum Beispiel loadData()/reloadData() in viewWillAppear aufrufen, das nach prepareForSegue() aufgerufen wird. Bedenken Sie, dass viewWillAppear möglicherweise in einer anderen Navigation wieder aufgerufen wird. Andernfalls könnten Sie den neuen Controller in Ihrem übergeordneten View-Controller instanziieren und präsentieren/drücken, anstatt das Segment zu verwenden.

Verwandte Themen