본문 바로가기

Swift

프로토타입 셀 제어

반응형

두가지 방법 : tag in attribute inspector , custom class

제어방법 1 : tag in attribute inspector

제어방법 2 : custom class

  • 아울렛 변수를 뷰 컨트롤러에 직접 정의하면 셀 내부 객체들이 정적인 객체가 되므로 사용하는데에 문제가 생깁니다.
  • 커스텀 클래스에 아울렛 변수를 정의하면 이는 동적으로 사용할 수 있는 형태의 객체가 되기 때문에 아울렛 변수를 통해 객체를 관리할 수 있습니다.
  • 따라서 태그 속성 사용 시 단점으로 꼽히는 객체 관리 문제나 잘못된 태그값을 호출하는 문제로부터 자유로워질 수 있으며, 유지 보수도 무척 편리해집니다.

방법

  1. UITableViewCell 을 상속 받는 클래스 작성
  2. 스토리보드에서 프로토타입 셀의 Class 속성을 MovieCell 클래스로 지정
  3. MovieCell에 아울렛 변수 지정
  4. tableView.dequeueReusableCell(withIdentifier: "ListCell") as! StudentCell 구문으로 변경 (재사용 큐에서는 커스텀으로 만든 StudentwCell로 캐스팅)

관련 코드

ListViewController.swift

import Foundation
import UIKit

class ListViewController: UITableViewController {
    var dataset = [
        ("철수", "201801", "감자반"),
        ("영희", "201802", "사과반"),
        ("복자", "201803", "포도반")
    ]

    lazy var list: [StudentVO] = {
        var datalist = [StudentVO]()
        for (name, number, group) in self.dataset {
            let svo = StudentVO()
            svo.name = name
            svo.number = number
            svo.group = group
            datalist.append(svo)
        }
        return datalist
    }()

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.list.count
    }

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 80
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // 1 by 1
        let row = self.list[indexPath.row]

        // Basic Cell 사용할 때
        //        let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell")!
        //        cell.textLabel?.name = row.name
        //        cell.numberTextLabel?.text = row.number
        // Custom Cell 사용할 때
        //        let name = cell.viewWithTag(101) as? UILabel
        //        let number = cell.viewWithTag(102) as? UILabel
        //        let group = cell.viewWithTag(103) as? UILabel
        //
        //        name?.text = row.name
        //        number?.text = row.number
        //        group?.text = row.group
        //        return cell
        // Custom Class 사용할 때
        let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell") as! StudentCell
        cell.name.text = row.name
        cell.number.text = row.number
        cell.group.text = row.group
        return cell
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("선택된 행은 \(indexPath.row)번째 행입니다.")
    }
}

StudentVo.swift

import Foundation

class StudentVO {
    var name: String?
    var number: String?
    var group: String?
}

StudentCell.swift

import UIKit

class StudentCell: UITableViewCell {
    @IBOutlet weak var name: UILabel!
    @IBOutlet weak var number: UILabel!
    @IBOutlet weak var group: UILabel!
}

참고

꼼꼼한 재은 씨의 스위프트 기본편

반응형