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