2015-04-11 4 views
22

Ich habe zwei Arrays Data1 und Data2 und ich möchte die Daten innerhalb jedes dieser (sie enthalten Zeichenfolgen) in eine Tabellenansicht in zwei verschiedenen Abschnitten auffüllen. Der erste Abschnitt sollte eine Überschrift "Einige Daten 1" und der zweite Abschnitt sollte "KickAss" haben.Wie bearbeite ich zwei Abschnitte in einer Tabellenansicht mit zwei verschiedenen Arrays mit swift?

Ich habe beide Abschnitte mit Daten aus dem ersten Array (aber auch keine Überschriften).

Hier ist mein Code so weit:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 2 
    } 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     var rowCount = 0 
     if section == 0 { 
      rowCount = Data1.count 
     } 
     if section == 1 { 
      rowCount = Data2.count 
     } 
     return rowCount 
    } 
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell 
     let ip = indexPath 
     cell.textLabel?.text = Data1[ip.row] as String 
     return cell 
    } 

im cellForRowAtIndexPath Verfahren ist es mir möglich, den Abschnitt irgendwie zu identifizieren, wie ich in dem numberOfRowsInSection Verfahren getan habe? Wie gebe ich Titel für jeden Abschnitt? Danke

+0

ich für ein paar Stunden wurden für diese Suche, und das ist das einzige, was für mich gearbeitet. Vielen Dank. –

Antwort

12

Sie können bestimmen, in welchem ​​Abschnitt Sie sich befinden, indem Sie indexPath.section betrachten. Um die Titel angeben, überschreiben die Funktion

func tableView(tableView: UITableView!, titleForHeaderInSection section: Int) -> String! 
+0

Danke euch allen. Das war die schnelle und schmutzige Lösung, mit der ich ging. – Woody

52

Tableview Zellen

Sie ein mehrdimensionales Array verwenden könnte. Zum Beispiel:

let data = [["0,0", "0,1", "0,2"], ["1,0", "1,1", "1,2"]] 

Für die Anzahl der Abschnitte verwenden:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return data.count 
} 

Dann die Anzahl der Zeilen in jedem Abschnitt Verwendung zu spezifizieren:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return data[section].count 
} 

Schließlich müssen Sie einrichten Ihre Zellen:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cellText = data[indexPath.section][indexPath.row] 

    // Now do whatever you were going to do with the title. 
} 

Tableview Header

Sie wieder ein Array verwenden könnte, aber mit nur einer Dimension dieses Mal: ​​

let headerTitles = ["Some Data 1", "KickAss"] 

nun die Titel für die Abschnitte einzustellen:

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    if section < headerTitles.count { 
     return headerTitles[section] 
    } 

    return nil 
} 

Der obige Code überprüft um zu sehen, gibt es einen Titel für diesen Abschnitt und gibt es zurück, sonst wird nil zurückgegeben. Es wird keinen Titel geben, wenn die Anzahl der Titel in headerTitles kleiner ist als die Anzahl der Arrays in data.

Das Ergebnis

enter image description here

15

Sie ein Struct schaffen könnten die Daten, die als Alternative zu meiner vorherigen Antwort auf einen Abschnitt gehört zu halten.Zum Beispiel:

struct SectionData { 
    let title: String 
    let data : [String] 

    var numberOfItems: Int { 
     return data.count 
    } 

    subscript(index: Int) -> String { 
     return data[index] 
    } 
} 

extension SectionData { 
    // Putting a new init method here means we can 
    // keep the original, memberwise initaliser. 
    init(title: String, data: String...) { 
     self.title = title 
     self.data = data 
    } 
} 

Jetzt in Ihrem View-Controller Sie die Konfigurationsdaten Ihrer Abschnitt könnte etwa so:

lazy var mySections: [SectionData] = { 
    let section1 = SectionData(title: "Some Data 1", data: "0, 1", "0, 2", "0, 3") 
    let section2 = SectionData(title: "KickAss", data: "1, 0", "1, 1", "1, 2") 

    return [section1, section2] 
}() 

Section Headers

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return mySections.count 
} 

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    return mySections[section].title 
} 

Im Vergleich zu meiner vorherigen Antwort, Sie jetzt müssen Sie sich nicht darum sorgen, die Anzahl von headerTitles mit der Anzahl der Arrays in data zu vergleichen.

Tableview Zellen

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return mySections[section].numberOfItems 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cellTitle = mySections[indexPath.section][indexPath.row] 

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell 
    cell.textLabel?.text = cellTitle 

    return cell 
} 
+2

Ich folgte diesen Schritten (iOS10, Swift 3) und es funktioniert. Ziemlich hilfreich. Vielen Dank! – Kai

+0

Große Lösung! Viel besser, Strukturen zu verwenden als 2D-Arrays in diesem Fall – Imran

+0

Wie kann diese Lösung auf den gleichen Aufbau aber mit dynamischen Zellen anwenden? Ich habe 4 verschiedene Arrays, die zwei Abschnitte füllen, die von einem segmentierten Steuerelement mit zwei Segmenten gesteuert werden. Das Problem, auf das ich mit Ihrer Lösung stoße, ist, dass meine Sektionen keine tiefgestellten Mitglieder haben, so dass ich die Zellen nicht füllen kann. – AlexVilla147