Sobes.tech
Junior

Como implementar uma lista com um grande número de células no iOS?

sobes.tech IA

Resposta da IA

Para mostrar listas grandes, usam-se UITableView ou UICollectionView. Implementam o padrão de reutilização de células (Cell Reuse), que permite gerir eficientemente a memória e o desempenho.

Passos principais:

  1. Criar UITableView ou UICollectionView: Coloque uma instância da classe correspondente na tela.

  2. Atribuir DataSource e Delegate: Defina o controlador ou outro objeto como dataSource e delegate.

    // Exemplo para UITableView
    tableView.dataSource = self 
    tableView.delegate = self
    
    • dataSource é responsável por fornecer os dados para a lista (número de secções/linhas, conteúdo das células).
    • delegate gere eventos relacionados com a interação do utilizador com as células (seleção, deslizes, etc.) e a aparência.
  3. Registar células: Registe as classes de células (UITableViewCell ou UICollectionViewCell) para reutilização. Pode usar classes ou nibs.

    // Exemplo de registo de uma célula personalizada de UITableView
    tableView.register(MyCustomCell.self, forCellReuseIdentifier: "MyCellIdentifier")
    
    // Exemplo de registo de uma célula personalizada a partir de nib
    tableView.register(UINib(nibName: "MyCustomCell", bundle: nil), forCellReuseIdentifier: "MyCellIdentifier")
    
  4. Implementar métodos dataSource: Métodos obrigatórios para UITableViewDataSource:

    • numberOfSections(in:) : Retorna o número de secções.
    • tableView(_:numberOfRowsInSection:) : Retorna o número de linhas na secção.
    • tableView(_:cellForRowAt:) : Método chave para reutilização. Aqui, a célula é solicitada do pool.
    // Exemplo de implementação de tableView(_:cellForRowAt:)
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // Obter a célula do pool para reutilização
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "MyCellIdentifier", for: indexPath) as? MyCustomCell else {
            fatalError("Impossível obter MyCustomCell") // Tratamento de erro
        }
        
        // Configurar conteúdo da célula com base nos dados
        let item = data[indexPath.row] // Assume-se um array de dados
        cell.configure(with: item) // Exemplo de método de configuração
        
        return cell
    }
    
  5. Implementar métodos delegate (opcional): Por exemplo, para tratar o clique numa célula:

    // Exemplo de tratamento de seleção de célula
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let selectedItem = data[indexPath.row]
        // Executar ação com o elemento selecionado
        print("Selecionado: \(selectedItem)")
    }
    

Princípio de reutilização de células:

O sistema iOS mantém um pool de células que já não são exibidas na tela. Quando é necessário mostrar uma nova célula (por exemplo, ao rolar), em vez de criar uma nova, o sistema usa uma célula previamente criada nesse pool. O método dequeueReusableCell(withIdentifier:for:) solicita essa célula. Isto poupa memória e recursos computacionais.

UICollectionView:

Funciona de forma semelhante ao UITableView, mas oferece maior flexibilidade na disposição dos elementos (grades, layouts personalizados). Requer implementação de UICollectionViewDataSource e UICollectionViewDelegate. Em vez de linhas e células, opera com elementos (items) e secções.

O uso de UITableView ou UICollectionView com reutilização de células é a forma padrão e mais eficiente de mostrar listas grandes no iOS.