Sobes.tech
Junior

Ako implementovať zoznam s veľkým počtom buniek na iOS?

sobes.tech AI

Odpoveď od AI

Na zobrazenie veľkých zoznamov sa používajú UITableView alebo UICollectionView. Implementujú vzor opakovanej použitia buniek (Cell Reuse), ktorý umožňuje efektívne riadenie pamäte a výkonu.

Hlavné kroky:

  1. Vytvorenie UITableView alebo UICollectionView: Umiestnite na obrazovku inštanciu príslušnej triedy.

  2. Priradenie DataSource a Delegate: Nastavte kontrolér alebo iný objekt ako dataSource a delegate.

    // Príklad pre UITableView
    tableView.dataSource = self 
    tableView.delegate = self
    
    • dataSource je zodpovedný za poskytovanie údajov pre zoznam (počet sekcií/radov, obsah buniek).
    • delegate spracováva udalosti súvisiace s interakciou používateľa s bunkami (výber, swipe atď.) a konfiguráciu vzhľadu.
  3. Registrácia buniek: Zaregistrujte triedy buniek (UITableViewCell alebo UICollectionViewCell) pre opakované použitie. Môžete použiť triedy alebo nib súbory.

    // Príklad registrácie vlastnej UITableViewCell z triedy
    tableView.register(MyCustomCell.self, forCellReuseIdentifier: "MyCellIdentifier")
    
    // Príklad registrácie vlastnej UITableViewCell z nib
    tableView.register(UINib(nibName: "MyCustomCell", bundle: nil), forCellReuseIdentifier: "MyCellIdentifier")
    
  4. Implementácia metód dataSource: Povinné metódy pre UITableViewDataSource:

    • numberOfSections(in:): Vráti počet sekcií.
    • tableView(_:numberOfRowsInSection:): Vráti počet riadkov v sekcii.
    • tableView(_:cellForRowAt:): Kľúčová metóda pre opakovanie. V tejto metóde sa žiada bunka z poolu.
    // Príklad implementácie `tableView(_:cellForRowAt:)`
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // Získanie bunky z poolu pre opakovanie
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "MyCellIdentifier", for: indexPath) as? MyCustomCell else {
            fatalError("Nedá sa odomknúť MyCustomCell") // Spracovanie chyby
        }
        
        // Nastavenie obsahu bunky na základe údajov
        let item = data[indexPath.row]
        cell.configure(with: item) // Príklad metódy konfigurácie bunky
        
        return cell
    }
    
  5. Implementácia metód delegate (voliteľné): Napríklad na spracovanie stlačenia bunky:

    // Príklad spracovania výberu bunky
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let selectedItem = data[indexPath.row]
        // Vykonajte akciu s vybraným prvkom
        print("Vybrané: \(selectedItem)")
    }
    

Princíp opakovanej použitia buniek:

Systém iOS udržiava pool buniek, ktoré už nie sú zobrazené na obrazovke. Keď je potrebné zobraziť novú bunku (napríklad pri posúvaní), namiesto vytvorenia novej systém použije už vytvorenú bunku z tohto poolu. Metóda dequeueReusableCell(withIdentifier:for:) žiada takúto bunku. To výrazne šetrí pamäť a výpočtové zdroje.

UICollectionView:

Funguje podobne ako UITableView, ale poskytuje väčšiu flexibilitu v usporiadaní prvkov (mriežky, vlastné rozloženia). Vyžaduje implementáciu UICollectionViewDataSource a UICollectionViewDelegate. Namiesto riadkov a buniek pracuje s prvkami (items) a sekciami.

Použitie UITableView alebo UICollectionView s opakovaným použitím buniek je štandardný a najefektívnejší spôsob zobrazenia veľkých zoznamov v iOS.