2017-11-30 6 views
-2

Ziel: Übergeben Sie ein Array von Informationen aus Tabellenansicht zu einer anderen Tabellenansicht mithilfe der Daten erstellt.Übergeben Array von Tabellenansicht zu Tabellenansicht

Problem: kann nicht die Array-Informationen zugreifen Tableviewcontroller in preparingForSegue

Ergebnis: Tableviewcontroller enthalten Mitarbeiternamen, und wenn Klick auf jedem des Mitarbeiters, geht es um die Details zu zeigen Anordnungen von Information.

1) Employee.swift (Modell für Daten)

struct Employee { 
    var name: String 
    var food: [String] 
    var ingredients: [String] 

    init(name: String, food: [String], ingredients: [String]) { 
     self.name = name 
     self.food = food 
     self.ingredients = ingredients 
    } 
} 

2) TableViewController.swift (zeigt den Namen des Mitarbeiters) Alles funktioniert hier gut mit den Codes, die einzige Sache, die ich bin hier zu kämpfen ist die Weitergabe der Information an den nächsten Viewcontroller. Im Kommentarbereich habe ich versucht, zu schreiben destination.food = lists [indexPath.row] .food. Dies hat nicht wie erwartet funktioniert. Ich versuche, die Array-Informationen abzurufen.

class VillageTableViewController: UITableViewController { 

    var lists : [Employee] = [ 
     Employee(name: "Adam" , food: ["Fried Rice","Fried Noodles"], ingredients: ["Insert oil, cook","Insert oil, cook"])] 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "showVillages" { 
      if let indexPath = self.tableView.indexPathsForSelectedRows { 
       let destination = segue.destination as? DetailsViewController 
        // pass array of information to the next controller 
      } 
     } 
    } 

3) DetailsTableViewController.swift (zeigt eine Anordnung von Informationen) Code gut funktioniert. Ich habe die Idee, ein leeres Array zu erstellen und die Informationen werden von TableViewController übergeben. Im Kommentarbereich, schreibe ich dann cell.textLabel? .text = Nahrung [indexPath.row] und cell.subtitle? .text = Zutaten [indexPath.row]

class DetailsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

var food:[String] = [] 
var ingredients:[String] = [] 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! DetailsTableViewCell 
    //this is where I will get the information passed from the array 
    return cell 
} 

Bitte beraten. Ich habe die letzten paar Stunden recherchiert und konnte es noch nicht herausfinden. Bedenken Sie, dass der gesamte Code hier funktioniert und ich habe nur Schwierigkeiten beim Zugriff auf die Array-Informationen.

Edit: Ich suche nach Arrays zugegriffen werden und auf DetailsTableViewController angezeigt werden.

+0

Wenn Sie sagen, „Das wie erwartet nicht funktioniert“, was tatsächlich passiert ist – Spads

+0

Daniel zeigte die Verbindungskette. Ich suche nach einem Array. Bitte lesen Sie die Fragen richtig. –

+0

@SwiftQuestions, es spielt keine Rolle, welcher _type_ der Daten zwischen den View-Controllern über das Segment übergeben werden soll; Wenn Sie einen vollständig benutzerdefinierten Datentyp erstellen, müssen Sie das Konzept der Übergabe nicht neu erlernen. – holex

Antwort

1

Nach Ihrer Frage, die Sie ein Artikel (der Mitarbeiter) zum Detail passieren gehen View-Controller, kein Array.

, dass Sie:

  • In VillageTableViewController ersetzen prepare(for mit

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
        if segue.identifier == "showVillages", 
         let indexPath = self.tableView.indexPathForSelectedRow { 
         let employee = lists[indexPath.row] 
         let destination = segue.destination as! DetailsViewController 
         destination.employee = employee 
        } 
    } 
    
  • In DetailsViewController erstellen eine Eigenschaft employee

    var employee : Employee! 
    

Jetzt können alle Eigenschaften des employee in der Detailansicht Controller zuzugreifen, zum Beispiel seine food Array als Datenquelle verwendet

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return employee.food.count 
} 

und

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! DetailsTableViewCell 
    cell.textLabel.text = employee.food[indexPath.row] 
    return cell 
} 

PS: Anstatt getrennte Arrays für Essen (Namen) und Zutaten Ich empfehle die Verwendung einer zweiten Struktur (in diesem Fall müssen Sie keine Initialisierer in beiden Strukturen schreiben)

struct Food { 
    let name : String 
    let ingredients: [String] 
} 


struct Employee { 
    let name: String 
    let food: [Food] 
} 

var lists : [Employee] = [ 
    Employee(name: "Adam" , food: [Food(name: "Fried Rice", ingredients:["Insert oil, cook"]), 
            Food(name: "Fried Noodles", ingredients: ["Insert oil, cook"])]) 

Der Vorteil ist, dass Sie Abschnitte im Detailansicht-Controller problemlos verwenden können.

func numberOfSections(in tableView: UITableView) -> Int { 
    return return employee.food.count 
} 

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    let food = employee.food[section] 
    return return food.name 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    let food = employee.food[section] 
    return food.ingredients.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! DetailsTableViewCell 
    let food = employee.food[indexPath.section] 
    cell.textLabel.text = food.ingredients[indexPath.row] 
    return cell 
} 
+0

Hey Vadian, ich habe versucht, lost employee = lists [indexPath.row] und habe den Fehler "Kann nicht den Wert des Typs [Employee] mit einem Index des Typs '[indexPath]' –

+0

Subscription Mein vorgeschlagener Code verwendet' indexPathForSelectedRow', Ihre Code 'indexPathsForSelectedRows', bitte beachten Sie den Unterschied – vadian

+0

Entschuldigung! Ich habe gerade bemerkt, dass! Lassen Sie es mich noch einmal versuchen. –

0

Wenn Sie genauer hinschauen, ist self.tableView.indexPathsForSelectedRows ein Array von IndexPaths. Warum versuchen Sie nicht

destination.food = lists[indexPath[0].row].food 
+0

Mein Programm stürzt sofort nach dem Ausführen ab. –

0

In Vorbereitung gesetzt Lebensmittel nach ausgewählten Mitarbeitern aus Listen

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "showVillages" { 
     guard let indexPath = tableView.indexPathsForSelectedRow, 
      let destinationVC = segue.destination as? DetailsViewController else { 
      return 
     } 
     destinationVC.food = lists[indexPath.row].food 
    } 
} 
Verwandte Themen