
์ฌ๋ฌ ์์ดํ ์ ํ ์ด๋ธ ํํ๋ก ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ๋ทฐ
iOS ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ์์ฃผ ์ฌ์ฉํ๊ฒ ๋๋ ์ธํฐํ์ด์ค์ธ UITableView ! ๋ฆฌ์คํธ ํํ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉด ์คํฌ๋กค์ด ๊ฐ๋ฅํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋์ ์ผ๋ก ๋ฐ์์ ํํํ ์ ์์ต๋๋ค. UIScrollView์ ์์์ ๋ฐ์ ๊ฐ์ฒด์ด๋ฉฐ, Delegate Pattern์ ์ฌ์ฉํด ๊ตฌํํ๋ ์ธํฐํ์ด์ค ๐ถ

ํ๋์ table view -> ์ฌ๋ฌ๊ฐ์ tableview section -> ์ฌ๋ฌ๊ฐ์ tableview cell -> tableview cell ๋ง๋ค ํ๋์ฉ์ content view -> contents

์์ฃผ์ฐ๋ ๋ฉ๋ก ์ด๋ ์ฑ์คํ ์ด์๋ ์๋ก์ฝ๋กฌ ํ ์ด๋ธ ๋ทฐ๊ฐ ์ ์ฉ๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ์ฉ! ๐ ์์ธํ ๋ณด์๋ฉด ํ ์ด๋ธ ๋ทฐ์ ์ ๋ค์ด ๋ฐ์ดํฐ๋ง ๋ฐ๋๊ณ ๋ชจ๋ ๋์ผํ layout ์ผ๋ก ๋ฐ๋ณต๋๊ณ ์๋ค๋ ์ฌ์ค์ ์ ์ ์์ต๋๋ค ! ๊ทธ๋ฐ๋ฐ.. ๐ ์ด๊ฑธ ํ๋ํ๋ ๋ค ์งค ์ ์์๋์ ! ์ด๋ด๋ tableview์ tableview cell ์ด ๋งค์ฐ ์ ์ฉํ๋ต๋๋ค โจ
์ด ์ค์์ ์ ๋ ํ์ ์์ ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ธ 2๋ฒ ๋ฐฉ๋ฒ์ผ๋ก ์ค์ต์ ํด๋ดค์ต๋๋น !
๋จผ์ ์๋ก์ด ํ์ผ์ ์ถ๊ฐํ๊ธฐ ์ํด Cocoa Touch Class ํ์ผ ์ ํ ํ UITableVIewCell๋ก ์ค์ , Also create XIB file์ ์ฒดํฌ !

๊ทธ ๋ค์์ ์์ด์ฝ ์ถ๊ฐ, autolayout, identifier ์ค์ ํ๊ธฐ ๐
๐ RankingTableViewCell
class RankingTableViewCell: UITableViewCell {
static let identifier = "RankingTableViewCell"
@IBOutlet weak var appIconImageView: UIImageView!
@IBOutlet weak var rankLabel: UILabel!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var subTitleLabel: UILabel!
@IBOutlet weak var openButton: UIButton!
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
func setData(rank: Int, appData: AppContentData) {
rankLabel.text = "\(rank)"
appIconImageView.image = appData.makeImage()
titleLabel.text = appData.appName
subTitleLabel.text = appData.description
}
}
1๏ธโฃ TableViewCell ์์ ๋ฏ์ ํจ์ ๋ฑ์ฅ...? awakeFromNib()
์ด ์น๊ตฌ๋ ๊ฐ์ฒด๊ฐ ์ด๊ธฐํ๋ํ ํธ์ถ๋๋ ๋ฉ์๋ ! viewDidLoad() ์ ๋น์ทํ ๊ฐ๋
์ผ๋ก ์๊ฐํ๋ฉด ๋๋ต๋๋น .. xib๋ก ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ์๋ init์ ๋ฐ๋ก ํด์ฃผ์ง ์๋๋ผ๋ ์๋์ผ๋ก awakeFromNib()์ผ๋ก ํธ์ถ์ด ๋ฉ๋๋ค ๐ฅ
2๏ธโฃ func setData : cell ๋ณ๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์์ผํ๋ฏ๋ก, AppContentData๋ฅผ ํจ์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๊ณ ์ด ๋งค๊ฐ๋ณ์๋ฅผ ํตํด outlet ๋ณ์๋ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ค !
( tableview cell์ ์ค์ ๊ตฌ์กฐ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ๊ณผ์ ์ ์๋ต .. )
UITableViewDelegate ์ UITableViewDataSource !!
์ฌ๊ธฐ์ ! ์๊ณ ๋์ด๊ฐ์ผํ ํ ์ด๋ธ ๋ทฐ์ ๋์์๋ฆฌ ^^...

๐ ๋ทฐ/์ ์ ์ฌ์ฌ์ฉ์ ๊ดํ ํฐ์คํ ๋ฆฌ ํฌ์คํ
์ด์ 2๊ฐ์ง ํ๋กํ ์ฝ์ ๋ํด ์์๋ณด์๋ฉด ..
1๏ธโฃ UITableViewDelegate : ํ
์ด๋ธ ๋ทฐ์ ๋์๊ณผ ๋ชจ์์ ๊ด๋ฆฌ
-> cell์ ๋์ด์ cell์ ํ ์ ๋ฌด์์ ํ ์ง ?
2๏ธโฃ UITableViewDataSource : ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ๋ทฐ๋ฅผ ๊ทธ๋ ค์ฃผ๋ ์ญํ
-> ์ด ์น์
๊ณผ ๊ทธ ์น์
์์ ๋ค์ด๊ฐ๋ cell์ ๊ฐ์, ๊ฐ row์ ์ด๋ค cell์ ๋ณด์ฌ์ค๊ฑด์ง ?
extension RankingVC: UITableViewDelegate {
// heightForRowAtํด์ indexPath๋ณ์ ๋์ด๋ง ์ง์ ํ๋ ํจ์
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 80
}
}
extension RankingVC: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return appContentList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: RankingTableViewCell.identifier) as? RankingTableViewCell else {return UITableViewCell()}
cell.setData(rank: indexPath.row + 1, appData: appContentList[indexPath.row])
return cell
}
}
tableview์๊ฒ ํด๋น identifier๋ฅผ ๊ฐ์ง cell์ด ์ฌ์ฌ์ฉ ํ์ ์๋์ง ๋ฌผ์ด๋ณด๊ณ ์์ผ๋ฉด, UITableViewCell ๊ฐ์ฒด๊ฐ ๋์ด์ค๊ณ ์๋๋ฉด nil ! ๊ทธ๋ฆฌ๊ณ ๋์ด์จ ๊ฐ์ฒด๋ฅผ as?๋ฅผ ํตํด ์ํ๋ ํ์ํด๋์ค๋ก ํ์ ๋ณํ. ์ด๋ ๊ฒ ๋๋ฉด, cell์ RankingTableViewCell ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ์ด์ ์ ์ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ๋ ํจ์ ์ฌ์ฉ ๊ฐ๋ฅ !!
1๏ธโฃ ๋ฐ๋ก๋ฐ๋ก ๋ฐ์ดํฐ ์ ๋ฌ์ ์ํด์ ๊ตฌ์กฐ์ฒด๋ก ์๋ก์ด ๋ฐ์ดํฐํ์ ๋ง๋๋ ๊ฒ์๋๋ค ! AppContentDataModel.swift ๋ผ๋ ์๋ก์ด ์ค์ํํธ ํ์ผ์ ๋ง๋ค์ด์ ์ฑ ์ด๋ฆ, ์ค๋ช , ์์ด์ฝ ์ด๋ฏธ์ง ์ด๋ฆ์ ๋ฃ๋ AppContentData ๋ชจ๋ธ์ ์ถ๊ฐํด์ค๋๋ค !
import UIKit
struct AppContentData{
let appName: String
let description: String
let appIconName: String
func makeImage() -> UIImage? {
return UIImage(named: appIconName)
}
}
2๏ธโฃ Cell์ ๊ตฌ๋ถํ๊ธฐ ์ํ idenntifier์ static์ ํ์ฉํด ํ์ ํ๋กํผํฐ๋ก ์ ์ธ !! ์ด๊ฑด ์คํ๋ก ์ธํ ์ค๋ฅ๋ฅผ ์ค์ด๋๋ฐ ์ข๋ค๊ณ ํฉ๋๋ค ๐ก
class RankCollectionViewCell: UICollectionViewCell {
static let identifier = "RankCollectionViewCell"
...
}
3๏ธโฃ xib ํ์ผ๋ก Cell UI ๊ตฌ์ฑ์, ํ ์ด๋ธ ๋ทฐ๋ง๋ค cell๋ก์ ์ฌ์ฉํ nib ๊ฐ์ฒด๋ฅผ ๋ฑ๋กํด ์ฃผ์ด์ผํจ.
func registerXib(){
let xibName = UINib(nibName: RankingTableViewCell.identifier, bundle: nil)
rankTableView.register(xibName, forCellReuseIdentifier: RankingTableViewCell.identifier)
}

์ฝ..์ง ์์๋ ํ
์ด๋ธ ๋ทฐ.. ใดใ
์.. ^^ .. ๋ค์์ ๋ ์์๋ณด๋๋กํ๊ณ .. ์ฌ๊ธฐ์ ์ด๋ง.. ๐ฅ
su_vera ๋ ๊ฐ์ฌํฉ๋๋ค! ๋๋ถ์ xib๋ก cell ์ ๋ง๋๋ ์ฐ์ต์ด ๋์์ด์!
์ฌ๊ธฐ์ cell์ ๋๋ฅด๋ฉด ๋ค์ ํ๋ฉด์ผ๋ก ์ ํํ๊ณ ์ถ์๋ฐ ๊ทธ๋ด ๊ฒฝ์ฐ๋, ์ด๋ป๊ฒ ํ๋ฉด ์ข์๊น์?!
์คํ ๋ฆฌ๋ณด๋๋ก ํ ๋๋ ์คํ ๋ฆฌ๋ณด๋์ cell ์ด ์์ด์ segue ๋ก ํ์๋๋ฐ xib๋ก ํ๋ ์คํ ๋ฆฌ๋ณด๋์๋ cell ์ด ์์ด ์ฐ๋์ ์ด๋ป๊ฒ ํ๋ฉด ์ข์์ง ๊ณ ๋ฏผ์ด๋ค์!