uitableviewcontroller tutorial example ios uitableview date swift sections

ios - example - uitableview tutorial swift 4



Agregar secciones, separadas por fechas, a UITableView en Swift (3)

Necesitaba algo similar, y aunque la solución de funciona, cuando hay muchas secciones / filas, la tabla demoró mucho tiempo en cargar datos, e incluso después de eso no fue muy receptivo. El problema principal allí es la función getSectionItems, ya que siempre pasará por todos los elementos ...

Mi solución:

struct TableItem { let title: String let creationDate: NSDate } var sections = Dictionary<String, Array<TableItem>>() var sortedSections = [String]() @IBAction func saveButton(sender: AnyObject) { let date:String = "your date in string..." //if we don''t have section for particular date, create new one, otherwise we''ll just add item to existing section if self.sections.indexForKey(date) == nil { self.sections[date] = [TableItem(title: name, creationDate: date)] } else { self.sections[date]!.append(TableItem(title: name, creationDate: date)) } //we are storing our sections in dictionary, so we need to sort it self.sortedSections = self.sections.keys.array.sorted(>) self.tableView.reloadData() }

TableView dataSource métodos:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return sections.count } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return sections[sortedSections[section]]!.count } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier("Cell") let tableSection = sections[sortedSections[indexPath.section]] let tableItem = tableSection![indexPath.row] cell.titleLabel?.text = tableItem.title return cell } override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return sortedSections[section] }

Soy un novato completo en la programación de Swift y iOS, por lo que tendrás que perdonar la pregunta, tal vez simple.

He creado un tableView que muestra el contenido de una matriz (cadenas) con solo presionar un botón. Ahora, me gustaría "agrupar" estas cadenas en las secciones de tableView, ordenadas por fecha.

Más detalladamente: cuando el usuario toca el botón, la cadena debe insertarse en el índice 0 de la matriz y mostrarse en una sección con un encabezado de la fecha actual. Si hay valores más antiguos que la fecha de hoy en la matriz, estos deben mostrarse en una sección separada para esa fecha. Cada sección debe corresponder a un día de 24 horas y mostrar todas las cadenas agregadas durante ese día.

Aquí hay un código de ejemplo de lo que he logrado hasta ahora:

var testArray[String]() var sectionsInTable[String]() @IBOutlet weak var testTable: UITableView! @IBAction func saveButton(sender: AnyObject) { testArray.insert("/(strTest)", atIndex: 0) testTable.reloaddata() } func numberOfSectionsInTableView(tableView: UITableView) -> Int { return sectionsInTable.count } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ return testArray.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell") cell.textLabel.text = String(testArray[indexPath.row]) return cell }

Realmente no sé cómo manejar la parte de las secciones. Esperemos que alguien pueda apuntarme en la dirección correcta. ¡Gracias!


Normalmente haría esto con Core Data y NSFetchedResultsController ya que tiene métodos incorporados para obtener secciones.

Sin embargo, responderé a la pregunta sin usar Core Data. El código es un poco más desordenado pero aquí vamos ...

Primero, debe crear un objeto que almacene tanto la fecha como el texto. El testArray será una matriz de estos objetos, en lugar de una matriz String. Por ejemplo:

class DateTextItem: NSObject { var text: String = "" var insertDate: NSDate = NSDate() } var testArray = [DateTextItem]()

Luego, cuando se golpea el botón saveButton, crearemos y agregaremos el objeto DateTextItem. También agregaremos la fecha a las secciones Tabla de tabla si aún no existe.

@IBAction func saveButton(sender: AnyObject) { let newItem = DateTextItem() newItem.text = "Test /(testArray.count)" // this is for development only // increment the date after 2 records so we can test grouping by date if testArray.count >= (testArray.count/2) { let incrementDate = NSTimeInterval(86400*(testArray.count/2)) newItem.insertDate = NSDate(timeIntervalSinceNow:incrementDate) } testArray.append(newItem) // this next bit will create a date string and check if it''s in the sectionInTable let df = NSDateFormatter() df.dateFormat = "MM/dd/yyyy" let dateString = df.stringFromDate(newItem.insertDate) // create sections NSSet so we can use ''containsObject'' let sections: NSSet = NSSet(array: sectionsInTable) // if sectionsInTable doesn''t contain the dateString, then add it if !sections.containsObject(dateString) { sectionsInTable.append(dateString) } self.tableView.reloadData() }

A continuación, creé una función para obtener los elementos en una sección, ya que la necesitamos en un par de lugares.

func getSectionItems(section: Int) -> [DateTextItem] { var sectionItems = [DateTextItem]() // loop through the testArray to get the items for this sections''s date for item in testArray { let dateTextItem = item as DateTextItem let df = NSDateFormatter() df.dateFormat = "MM/dd/yyyy" let dateString = df.stringFromDate(dateTextItem.insertDate) // if the item''s date equals the section''s date then add it if dateString == sectionsInTable[section] as NSString { sectionItems.append(dateTextItem) } } return sectionItems }

Finalmente, aquí es cómo se ven los métodos de Fuente de datos de vista de tabla

// MARK: - Table view data source override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return sectionsInTable.count } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.getSectionItems(section).count } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // Configure the cell... var cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell") // get the items in this section let sectionItems = self.getSectionItems(indexPath.section) // get the item for the row in this section let dateTextItem = sectionItems[indexPath.row] cell.textLabel.text = dateTextItem.text return cell } // print the date as the section header title override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return sectionsInTable[section] }


Tienes que hacer una matriz para cada día (llamada dayArray [] por ejemplo) y agregarla a la sección InTable [] y hacer algo como eso:

func numberOfSectionsInTableView(tableView: UITableView) -> Int { return sectionsInTable.count } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ return sectionsInTable.objectAtIndex(section).count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell") cell.textLabel.text = String(sectionInTable.objectAtIndex(indexPath.section).objectAtIndex(indexPath.row)) return cell }

Lo siento si cometí errores, no estoy familiarizado con Swift pero creo que la idea puede ayudar.