TableView 커스텀 프로토타입셀
1. 태그로 참조하는 방법
1. 인터페이스 빌더에서 객체에 Tag속성값을 부여한다.
2. 스위프트코드에서 viewTag()메소드를 이용하여 객체를 불러온다.
3. 스위프트코드에서 반환된 객체를 적절한 타입으로 (ex:UILabel)으로 캐스팅 해준다.
이때 반환되는 타입은 옵셔널 이므로 적절히 처리한다.

스타일을 Custom으로 설정한다.


흰색 네모를 아래로 끌어당기면 높이를 조정할수 있다. / 고정값을 수치로 입력해서 설정할수도 있다.

label의 위치를 View x, y, width, height로 설정 할 수 있다.

태그의 101이라는 숫자로 객체를 참조할 수 있다. 코드로 작성한다. 끌어서 연결하는것이 아님
import UIKit
class ListViewcontroller: UITableViewController {
// 튜플 아이템으로 구성된 데이터 세트
var dataset = [
("다크나이트", "다크나이트 배트맨","2020-010-15",8.95, "01.jpg"),
("호우시절", "때를 알고 내리는 좋은비","2020-010-15",7.53, "02.jpg"),
("말할수없는비밀", "말할수없는비밀대만영화", "2015-09-08", 9.93,"03.jpg")
]
//테이블뷰를 구성할 리스트데이터
lazy var list: [MovieVo] = {
var datalist = [MovieVo]()
for (title, desc, opendate, rating, thumbnail) in self.dataset {
let mvo = MovieVo()
mvo.title = title
mvo.description = desc
mvo.opendate = opendate
mvo.rating = rating
mvo.thumbnail = thumbnail
datalist.append(mvo)
}
return datalist
}()
override func viewDidLoad() {
}
// 테이블뷰의 행의 개수를 반환하는 메소드
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.list.count
}
// 테이블뷰의 행을 구성하는 메소드
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// 주어진 행에 맞는 데이터 소스를 읽어온다.
let row = self.list[indexPath.row]
// 테이블 셀 객체를 직접생성하는 대신 큐로부터 가져옴
let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell")!
// 영화제목이 표시될 레이블을 title변수로 받는다.******************************
let title = cell.viewWithTag(101) as? UILabel
// 영화설명
let desc = cell.viewWithTag(102) as? UILabel
// 개봉일
let opendate = cell.viewWithTag(103) as? UILabel
// 별점
let rating = cell.viewWithTag(104) as? UILabel
// 데이터 소스에 저장된 값을 각 레이블 변수에 할당
title?.text = row.title
desc?.text = row.description
opendate?.text = row.opendate
rating?.text = "\(row.rating!)"
thumbnail.image = UIImage(named: row.thumbnail!)
return cell
}
// 테이블 셀을 클릭하거나 터치했을때의 액션처리
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
NSLog("선택된 행은 \(indexPath.row)번째 행입니다.")
}
}
viewWithTag() 메소드를 사용하는데 이때 객체마다 각각의 태그 값이 필요하다.
이미지나 버튼, 스위치 등 객체 대부분을 불러올수 있다.
입력되지 않은 잘못된 태그값을 인자로 호출할 경우를 대비해 메소드의 반환값은 옵셔널 타입으로 정의한다.
2. 커스텀 클래스를 생성해 프로토타입셀의 객체를 제어하는방법
프로토타입 셀자체를 커스텀클래스와 연결한다음, 셀위에 올려진 객체를 아울렛 변수로 연결해서 참조한다.
1. 원하는 객체를 프로토타입 셀에 추가한다.
2. MovieCell 클래스에 아울렛 변수를 등록한다.
3. ListViewController클래스에서 아울렛 변수를 제어한다.
MovieCell.swift 파일을 생성한다.

프로토타입셀의 Class속성을 MovieCell 클래스로 지정한다.

MovieCell class와 올려진 객체를 아울렛 변수로 연결한다.
ListViewController.swift 에 함수내용 추가
import UIKit
class ListViewcontroller: UITableViewController {
// 튜플 아이템으로 구성된 데이터 세트
var dataset = [
("다크나이트", "다크나이트 배트맨","2020-010-15",8.95, "01.jpg"),
("호우시절", "때를 알고 내리는 좋은비","2020-010-15",7.53, "02.jpg"),
("말할수없는비밀", "말할수없는비밀대만영화", "2015-09-08", 9.93,"03.jpg")
]
//테이블뷰를 구성할 리스트데이터
lazy var list: [MovieVo] = {
var datalist = [MovieVo]()
for (title, desc, opendate, rating, thumbnail) in self.dataset {
let mvo = MovieVo()
mvo.title = title
mvo.description = desc
mvo.opendate = opendate
mvo.rating = rating
mvo.thumbnail = thumbnail
datalist.append(mvo)
}
return datalist
}()
override func viewDidLoad() {
}
// 테이블뷰의 행의 개수를 반환하는 메소드
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.list.count
}
// 테이블뷰의 행을 구성하는 메소드
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// 주어진 행에 맞는 데이터 소스를 읽어온다.
let row = self.list[indexPath.row]
// 커스텀 클래스에 정의 된 속성을 사용하려면, MovieCell타입으로 캐스팅을 해주어야한다.*************
let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell") as! MovieCell
// 데이터 소스에 저장된 값을 각 레이블 변수에 할당
cell.title?.text = row.title
cell.desc?.text = row.description
cell.opendate?.text = row.opendate
cell.rating?.text = "\(row.rating!)"
cell.thumbnail.image = UIImage(named: row.thumbnail!)
return cell
}
// 테이블 셀을 클릭하거나 터치했을때의 액션처리
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
NSLog("선택된 행은 \(indexPath.row)번째 행입니다.")
}
}
MovieCell 클래스에 정의된 속성을 사용하려면 MovieCell 타입으로 캐스팅 해주어야한다.