2017-10-03 1 views
2

Ich habe ein bisschen ein Polymorphie-Problem. Ich habe drei Arrays aList, bList und cList, die verschiedene Arten von Ausrüstung "A", "B", "C" enthalten.Wie kann ich mehrere Tabellenansichtsabschnitte füllen, wenn die Inhalte der Arrays unterschiedliche Typen haben?

Ich möchte einen Tableviewcontroller mit 3 Abschnitten für aList, bList, cList bevölkern. Aber ich bin zu kämpfen ein wenig, wenn ich zu bekommen:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

Das Problem, das ich habe, ist, dass im Idealfall i drei Arrays innerhalb eines Arrays zum Beispiel haben würde. Abschnitt = [aList, bList, cList).

In meinem Singleton "A", "B", "C" sind Strukturen und repräsentieren eine Art von Ausrüstung und so habe ich sie in Klassen und Unterklassen von einer "Equipment" Oberklasse und dann versucht, ein Array von zu erstellen die Oberklasse "Equipment" aber das hat auch nicht funktioniert.

Beratung wäre super.

class EquipmentListController: UITableViewController { 

    var model = SingletonModel.sharedInstance 

    var aList:[SingletonModel.A] = [] 
    var bList:[SingletonModel.B] = [] 
    var cList:[SingletonModel.C] = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    override func viewWillAppear(_ animated: Bool) { 

     super.viewWillAppear(animated) 
     aList = model.AList 
     bList = model.BList 
     cList = model.CList 
     sections.append(aList) 
     sections.append(bList) 
     sections.append(cList) 

    } 

    override func numberOfSections(in tableView: UITableView) -> Int { 

     return 3 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     switch section{ 
     case 1: 
      self.tableView.rowHeight = 70 
      return aList.count 
     case 2: 
      return bList.count 
     case 3: 
      return cList.count 

     default: 
      return 0 
     } 

    } 

Mein Problem ist, unten mit der Linie lassen Ausrüstung: SingletonModel.A (oder B oder C) - im Grunde i drei separate Arrays hat und jeweils eine andere Art.

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    { 

     guard let cell = tableView.dequeueReusableCell(withIdentifier: "equipmentcell", for: indexPath) as? EquipmentCell else 
     { 

     } 

     let equipment: SingletonModel.A (or B or C) = changeDataSource(indexPath: indexPath as NSIndexPath) 

     cell.equipmentTitle.text = equipment.equipmentName  
     cell.accessoryType = .disclosureIndicator  
     return cell 
    } 

    func changeDataSource(indexPath: NSIndexPath) -> SingletonModel.A, B or C 
    { 
     var equipment:SingletonModel.A (B or C) 
     equipment = A, B or C [indexPath.row] 
     return equipment 
    } 

    func tableView(tableView: UITableView!, titleForHeaderInSection section: Int) -> String! 
    { 
     switch section 
     { 
     case 1: 
      return "A" 
     case 2: 
      return "B" 
     case 3: 
      return "C" 
     default: 
      return nil 
     } 
    } 

    override func tableView(_ tableView: UITableView, 
        heightForHeaderInSection section: Int) -> CGFloat 
    { 
     return 40 
    } 

} 

Dank

Antwort

2

Zuerst müssen Sie Abschnitt Nummerierung beheben: Abschnitte von Null nummeriert sind, nicht von einem:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    switch section { 
    case 0: 
     return aList.count 
    case 1: 
     return bList.count 
    case 2: 
     return cList.count 
    default: 
     return -1 // Fail fast 
    } 
} 

Als nächstes ändern Sie die Art und Weise legen Sie die Zeilenhöhe:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    // Rows in section 0 are taller 
    return indexPath.section == 0 ? 70.0 : 50.0; 
} 

Jetzt können Sie einstellen, Ihre Zelle nach oben mit A, B oder C:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "equipmentcell", for: indexPath) as? EquipmentCell else 
    { 
     return nil 
    } 
    var equipment : BaseOfABC = nil 
    switch indexPath.section { 
    case 0: 
     equipment = SingletonModel.A 
    case 1: 
     equipment = SingletonModel.B 
    case 2: 
     equipment = SingletonModel.C 
    default: 
     assert(indexPath.section < 3, "Unknown section") 
    } 
    cell.equipmentTitle.text = equipment.equipmentName  
    cell.accessoryType = .disclosureIndicator  
    return cell 
} 
+0

Hallo. Vielen Dank. Kannst du mir bitte erklären, indexPath.section == 0? 70,0: 50,0; Prost – Mike

+1

@Mike Sie hatten diese Zeile in 'Fall 1' Ihres Codes:' self.tableView.rowHeight = 70' Das ist falsch - Sie sollten Zeilenhöhe nicht innerhalb eines Delegaten setzen. Wenn Sie die Zeilenhöhe des oberen Abschnitts auf 70 setzen und die restlichen Abschnitte auf 50 festlegen müssen, geben Sie eine Überschreibung für die Funktion "heightForRowAt: indexPath" an. – dasblinkenlight

2

In indexPath haben Sie die Zeile und den Abschnitt der Zelle:

indexPath.row 
indexPath.section 

Sie auf indexPath.section

1

Sie für jede (Geräte) Typ wechseln kann einen eigenen Zelltyp erstellen.

In

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) 

einschalten indexPath.section, den passenden Zelltyp erstellen und seine Attribute aus dem passenden (Ausrüstung) Array.

Verwandte Themen