Sobes.tech
Junior

¿Cómo implementar una lista con muchas celdas en iOS?

sobes.tech AI

Respuesta de la IA

Para mostrar listas grandes, se utilizan UITableView o UICollectionView. Implementan el patrón de reutilización de celdas (Cell Reuse), que permite gestionar eficientemente la memoria y el rendimiento.

Pasos principales:

  1. Crear UITableView o UICollectionView: Coloca una instancia de la clase correspondiente en la pantalla.

  2. Asignar DataSource y Delegate: Establece el controlador u otro objeto como dataSource y delegate.

    // Ejemplo para UITableView
    tableView.dataSource = self 
    tableView.delegate = self
    
    • dataSource es responsable de proporcionar los datos para la lista (cantidad de secciones/filas, contenido de las celdas).
    • delegate maneja eventos relacionados con la interacción del usuario con las celdas (selección, deslizamientos, etc.) y la apariencia.
  3. Registrar celdas: Registra las clases de celdas (UITableViewCell o UICollectionViewCell) para reutilización. Puedes usar clases o nibs.

    // Ejemplo de registro de una celda personalizada de UITableView
    tableView.register(MyCustomCell.self, forCellReuseIdentifier: "MyCellIdentifier")
    
    // Ejemplo de registro de una celda personalizada desde nib
    tableView.register(UINib(nibName: "MyCustomCell", bundle: nil), forCellReuseIdentifier: "MyCellIdentifier")
    
  4. Implementar métodos dataSource: Métodos obligatorios para UITableViewDataSource:

    • numberOfSections(in:): Retorna el número de secciones.
    • tableView(_:numberOfRowsInSection:): Retorna el número de filas en la sección.
    • tableView(_:cellForRowAt:): Método clave para reutilización. Aquí se solicita la celda del pool.
    // Ejemplo de implementación de tableView(_:cellForRowAt:)
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // Obtener la celda del pool para reutilización
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "MyCellIdentifier", for: indexPath) as? MyCustomCell else {
            fatalError("No se pudo obtener MyCustomCell") // Manejo de error
        }
        
        // Configurar contenido de la celda basado en los datos
        let item = data[indexPath.row] // Se asume un array de datos
        cell.configure(with: item) // Ejemplo de método de configuración
        
        return cell
    }
    
  5. Implementar métodos delegate (opcional): Por ejemplo, para manejar la selección de una celda:

    // Ejemplo de manejo de selección de celda
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let selectedItem = data[indexPath.row]
        // Realizar acción con el elemento seleccionado
        print("Seleccionado: \(selectedItem)")
    }
    

Principio de reutilización de celdas:

El sistema iOS mantiene un pool de celdas que ya no se muestran en pantalla. Cuando se necesita mostrar una nueva celda (por ejemplo, al desplazarse), en lugar de crear una nueva, el sistema usa una celda previamente creada de ese pool. El método dequeueReusableCell(withIdentifier:for:) solicita esa celda. Esto ahorra memoria y recursos computacionales.

UICollectionView:

Funciona de manera similar a UITableView, pero ofrece mayor flexibilidad en la disposición de los elementos (rejillas, diseños personalizados). Requiere implementar UICollectionViewDataSource y UICollectionViewDelegate. En lugar de filas y celdas, opera con elementos (items) y secciones.

El uso de UITableView o UICollectionView con reutilización de celdas es la forma estándar y más eficiente de mostrar listas grandes en iOS.