2015-04-11 9 views
22

Ho due matrici Data1 e Data2 e voglio popolare i dati all'interno di ognuno di questi (contengono stringhe) in una vista tabella in due sezioni diverse. La prima sezione dovrebbe avere un'intestazione "Alcuni dati 1" e la seconda sezione dovrebbe essere intitolata "KickAss".Come si popolano due sezioni in una vista tabella con due array diversi usando swift?

Ho entrambe le sezioni che popolano i dati del primo array (ma senza intestazioni).

Ecco il mio codice finora:

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 
    } 

nel metodo cellForRowAtIndexPath, è possibile per me per identificare la sezione in qualche modo come ho fatto nel metodo numberOfRowsInSection? Inoltre, come posso dare titoli a ciascuna sezione? Grazie

+0

io sono alla ricerca di questo per un paio d'ore e questa è l'unica cosa che ha funzionato per me. Grazie mille. –

risposta

12

È possibile determinare la sezione in cui ci si trova guardando indexPath.section. Per specificare i titoli, ignorare la funzione

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

Grazie a tutti. Questa è stata la soluzione rapida e sporca con cui sono andato. – Woody

52

tableView Cells

Si potrebbe utilizzare un array multidimensionale. Per esempio:

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

Per il numero di sezioni uso:

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

Quindi, specificare il numero di righe in ogni utilizzo sezione:

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

Infine, è necessario impostare le tue celle:

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 intestazioni

Si potrebbe ancora utilizzare una matrice, ma con solo una dimensione questa volta:

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

Ora per impostare i titoli per le sezioni:

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

    return nil 
} 

Il codice di cui sopra controlli per vedere c'è un titolo per quella sezione e lo restituisce, altrimenti viene restituito nil. Non ci sarà un titolo se il numero di titoli in headerTitles è inferiore al numero di array in data.

Il Risultato

enter image description here

15

Si potrebbe creare un Struct per contenere i dati che appartiene a una sezione, come alternativa alla mia risposta precedente.Per esempio:

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

Ora nel tuo controller di vista si potrebbe configurare i dati di sezione in questo modo:

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] 
}() 

Sezione intestazioni

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

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

Rispetto alla mia precedente risposta, ora non devi preoccuparti di far corrispondere il numero di headerTitles al numero di array in data.

Cells tableView

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

Ho seguito questa procedura (iOS10, Swift 3) e funziona. Abbastanza utile. Grazie! – Kai

+0

Ottima soluzione! Molto meglio usare le strutture rispetto agli array 2D in questo caso – Imran

+0

Come si può applicare questa soluzione allo stesso build ma con celle dinamiche? Ho 4 matrici diverse che popolano due sezioni controllate da un controllo segmentato con due segmenti. Il problema che sto affrontando con la soluzione è che le mie sezioni hanno membri noch subscript che è il modo in cui non riesco a riempire le celle. – AlexVilla147