[iOS] 테이블 뷰 Custom Cell 사용하기

커스텀 셀


커스텀 셀을 사용하기 위해서는 UITableViewCell 클래스가 있는 새 파일이 필요하다.


class CustomTableViewCell: UITableViewCell {

    @IBOutlet weak var dateLabel: UILabel!
    @IBOutlet weak var cityLabel: UILabel!
    @IBOutlet weak var timeLabel: UILabel!
    
 
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

스토리보드 프로토타입 셀 안에 있는 컨텐츠들을 Outlet으로 연결할 때 방금 생성한 파일에 연걸해 줘야한다. 만약 ViewController에 연결을 하려고 하면 아래와 같이 오류가 나오는데 프로토타입 셀은 반복적으로 표시되는 템플릿으로 사용되기 떄문에 셀 안에 있는 Label을 접근할 때 몇번째 셀안에 있는 Label인지 알지 못해서 생기는 오류이다.

extension ViewController: UITableViewDataSource { 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = timeTableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! CustomTableViewCell
        
        cell.dateLabel.text = "오늘"
        cell.cityLabel.text = "베를린"
        cell.timeLabel.text = "22:00"
        
        return cell
    }
}

테이블 뷰의 셀에 접근할 때 프로토타입의 셀이 아닌 우리가 만든 셀의 클래스로 접근하려면 다운캐스팅으로 접근해야한다. 왜냐하면 dequeueResuableCell이 업캐스팅 되서 리턴되기 때문이다.



하나의 커스텀 셀을 여러 ViewController에서 사용하기


커스텀 셀 하나를 여러 뷰에서 사용하고 싶다고 똑같은 셀을 여러개 만들면 비효율적이다. 그래서 하나의 커스텀 셀을 여러곳에 사용하는 방법은 nib파일을 만들어서 거기에 커스텀 셀을 만드는 것이다. 스토리보드에서 만드는 방식하고 똑같다.

let customCell = UINib(nibName: "CustomCell", bundle: nil)
timeTableView.register(customCell, forCellReuseIdentifier: "customCell")

그리고 뷰컨트롤러 viewdidload에서 UINib을 활용해서 테이블뷰에 우리가 만든 커스텀 셀을 추가 하면된다. nib파일 안에서 셀의 identifier값을 줄 필요가 없는 이유는 여기서 identifier 값을 설정하기 때문이다.