티스토리 뷰

TableViewCell이나 CollectionViewCell은 공통점이 있습니다.

그건 바로 셀을 재사용한다는 건데요.

 

만약 30개의 셀에 각각의 다른 내용을 넣어야한다고 가정했을 때

30개의 셀을 만들어서 관리하면 그만큼 자원을 많이 가져가기 때문에

셀을 몇개만 만들어놓고 돌려씁니다.

 

extension SecondViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 30
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "secondCell", for: indexPath)
        cell.textLabel?.text = "\(indexPath.row)"
        
        if indexPath.row == 5 {
            cell.backgroundColor = .black
        }
        return cell
    }
}

30개의 셀중에서 6번째 줄에 검정색으로 칠해보겠니다.

 

6번째 줄에 검정색으로 줄이 생겼습니다.

이걸 스크롤하게되면

다른 줄에서도 검정색이 칠해지네요.

 

indexPath.row == 5에서 검정색으로 칠했던 셀이 그대로 재사용돼서 그렇습니다.

근데 숫자는 제대로 나옵니다.

우리가 셀의 숫자들은 indexPath.row 마다 설정을 해줬기 때문에 그렇습니다.

그러면 배경색도 indexPath.row마다 설정을 해준다면 이러한 문제가 생기지 않습니다.

 

extension SecondViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 30
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "secondCell", for: indexPath)
        cell.textLabel?.text = "\(indexPath.row)"
        
        if indexPath.row == 5 {
            cell.backgroundColor = .black
        } else {
            cell.backgroundColor = .systemBackground
        }
        
        return cell
    }
}

 

포인트는 "모든 indexPath.row마다 값을 정해준다" 입니다.

CollectionView에서도 똑같습니다.

 

특정 조건에서 변화를 줬다면 그 조건에 해당하지 않을때는 초기화해주는 코드를 작성해주시면 됩니다.

 

!다른 방법

prepareForReuse()

셀을 재사용할 때 사용할 수 있는 메서드입니다.

 

UICollectionViewCell이나 UITableViewCell에서 사용할 수 있는데

성능 이슈 때문에 알파값, 선택 상태 등컨텐츠와 관련 없는 속성들만 reset하는데 사용하길 권장합니다.

 

댓글
공지사항