Sobes.tech
Junior

Cum se implementează o listă cu un număr mare de celule pe iOS?

sobes.tech AI

Răspuns de la AI

Pentru afișarea listelor mari, se utilizează UITableView sau UICollectionView. Acestea implementează pattern-ul de reutilizare a celulelor (Cell Reuse), care permite gestionarea eficientă a memoriei și performanței.

Pașii principali:

  1. Crearea UITableView sau UICollectionView: Plasați o instanță a clasei corespunzătoare pe ecran.

  2. Atribuirea DataSource și Delegate: Stabiliți controlerul sau alt obiect ca dataSource și delegate.

    // Exemplu pentru UITableView
    tableView.dataSource = self 
    tableView.delegate = self
    
    • dataSource răspunde de furnizarea datelor pentru listă (numărul de secțiuni/rânduri, conținutul celulelor).
    • delegate gestionează evenimentele legate de interacțiunea utilizatorului cu celulele (selectare, swipe-uri etc.) și configurarea aspectului.
  3. Înregistrarea celulelor: Înregistrați clasele de celule (UITableViewCell sau UICollectionViewCell) pentru reutilizare. Puteți folosi clase sau fișiere nib.

    // Exemplu de înregistrare a unei celule personalizate UITableViewCell din clasă
    tableView.register(MyCustomCell.self, forCellReuseIdentifier: "MyCellIdentifier")
    
    // Exemplu de înregistrare a unei celule personalizate UITableViewCell din nib
    tableView.register(UINib(nibName: "MyCustomCell", bundle: nil), forCellReuseIdentifier: "MyCellIdentifier")
    
  4. Implementarea metodelor dataSource: Metode obligatorii pentru UITableViewDataSource:

    • numberOfSections(in:): Returnează numărul de secțiuni.
    • tableView(_:numberOfRowsInSection:): Returnează numărul de rânduri în secțiune.
    • tableView(_:cellForRowAt:): Metoda cheie pentru reutilizare. În această metodă se solicită celula din pool.
    // Exemplu de implementare a tableView(_:cellForRowAt:)
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // Obțineți celula din pool pentru reutilizare
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "MyCellIdentifier", for: indexPath) as? MyCustomCell else {
            fatalError("Unable to dequeue MyCustomCell") // Tratarea erorii
        }
        
        // Configurarea conținutului celulei pe baza datelor
        let item = data[indexPath.row] // presupunând un array de date
        cell.configure(with: item) // exemplu de metodă de configurare a celulei
        
        return cell
    }
    
  5. Implementarea metodelor delegate (opțional): De exemplu, pentru tratarea atingerii unei celule:

    // Exemplu de tratare a selectării unei celule
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let selectedItem = data[indexPath.row]
        // Executați o acțiune cu elementul selectat
        print("Selected: \(selectedItem)")
    }
    

Principiul reutilizării celulelor:

Sistemul iOS menține un pool de celule care nu mai sunt afișate pe ecran. Când trebuie afișată o nouă celulă (de exemplu, la derulare), în loc să creeze o nouă, sistemul folosește o celulă deja creată din pool. Metoda dequeueReusableCell(withIdentifier:for:) solicită o astfel de celulă. Acest lucru economisește semnificativ memorie și resurse de calcul.

UICollectionView:

Funcționează similar cu UITableView, dar oferă mai multă flexibilitate în aranjarea elementelor (rețele, layout-uri personalizate). Necesită implementarea UICollectionViewDataSource și UICollectionViewDelegate. În loc de rânduri și celule, operează cu elemente (items) și secțiuni.

Utilizarea UITableView sau UICollectionView cu reutilizarea celulelor este metoda standard și cea mai eficientă pentru afișarea listelor mari în iOS.