with grouped example custom arrays uitableview swift sections

arrays - grouped - ¿Cómo puedo completar dos secciones en una vista de tabla con dos matrices diferentes usando swift?



uitableview swift 4 (3)

Tengo dos arrays, Data1 y Data2, y deseo completar los datos dentro de cada uno de estos (contienen cadenas) en una tabla vista en dos secciones diferentes. La primera sección debe tener un encabezado "Some Data 1" y la segunda sección debe titularse "KickAss".

Tengo ambas secciones pobladas con datos de la primera matriz (pero sin encabezados tampoco).

Aquí está mi código hasta ahora:

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 }

en el método cellForRowAtIndexPath, ¿es posible para mí identificar la sección de alguna manera como lo hice en el método numberOfRowsInSection? Además, ¿cómo le doy títulos a cada sección? Gracias


Podría crear un Struct para contener los datos que pertenecen a una sección, como alternativa a mi respuesta anterior. Por ejemplo:

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

Ahora en su controlador de vista puede configurar los datos de su sección de la siguiente manera:

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

Encabezados de sección

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

En comparación con mi respuesta anterior, ahora no tiene que preocuparse por igualar el número de headerTitles de headerTitles con el número de matrices en los data .

TableView Cells

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 }


Puede determinar en qué sección se encuentra consultando indexPath.section . Para especificar los títulos, anule la función

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


TableView Cells

Podría usar una matriz multidimensional. Por ejemplo:

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

Para el número de secciones use:

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

Luego, para especificar el número de filas en cada sección, use:

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

Finalmente, necesita configurar sus celdas:

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 Headers

Podría volver a utilizar una matriz, pero esta vez con solo una dimensión:

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

Ahora para configurar los títulos para las secciones:

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

El código de arriba comprueba para ver que hay un título para esa sección y lo devuelve; de ​​lo contrario, se devuelve nil . No habrá un título si el número de títulos en los títulos es menor que el número de matrices en los data .

El resultado