์ฑํ ์ฐฝ์์ ์ฑํ ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด Table View ๋ฅผ ์ฌ์ฉํด๋ณด์.
Table View๋ ๋ฐ์ดํฐ๋ฅผ ๋ฟ๋ฆด DataSource์ ๋ฆฌ์คํธ์ ์ด๋ฒคํธ๋ฅผ ๋ถ์ฌํ Delegate ํ๋กํ ์ฝ์ด ํ์ํ๋ค.
1) DataSource extension: table view์ index์ ๋ง์ถฐ ๋ฐ์ดํฐ๋ฅผ ๋ฟ๋ฆฌ๊ธฐ ์ํจ
2) Delegate extension: table view ๋ฆฌ์คํธ์ index์์ ๊ฐ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ๋ถ์ฌํ๊ธฐ ์ํจ
1. Table View ์ถ๊ฐ
View ์ Table View ๋ฅผ ์ถ๊ฐํ๊ณ ์ฝ๋์์์ ์ฐ๊ฒฐํ๋ค.
2. table view ์ dataSource ์ self ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฌํด์ค๋ค.
IBOutlet ์ผ๋ก UITableView๋ฅผ ์ฐ๊ฒฐํด์ค๋ค.
๋ํ, viewDidLoad() ํจ์ ๋ด์์ ๋ทฐ๊ฐ ๋ก๋๋ ํ์ ChatViewController ํด๋์ค์์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ์ ์๋๋ก tableView.dataSource = self ๋ฅผ ์ ์ธํด์คฌ๋ค.
3. DataSource extension ๊ตฌํํ๊ธฐ
UITableViewDataSource ํ๋กํ ์ฝ์ ํ์ฅํ์ฌ ๊ตฌํํด์ค๋ค.
์ด ๋ ์ฌ์ฉํ ํจ์๋ค์ ์๋์ ๊ฐ๋ค.
//ํ์ ๊ฐ์๋ฅผ ๋ฐํํ๋ ํจ์
func tableView(UITableView, numberOfRowsInSection: Int) -> Int
//์ฌ์ฌ์ฉ ๊ฐ๋ฅํ table view cell์ ์์ฑํ์ฌ ๋ฐํํ๋ ํจ์
func tableView(UITableView, cellForRowAt: IndexPath) -> UITableViewCell
์ด ํจ์๋ dequeueReusableCell(withIdentifier: String, for: IndexPath) ํจ์์ ํจ๊ป ์ฌ์ฉํ๋ค.
์ฌ์ฉ ์์ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
numberOfRowsInSection ์์ Message ๋ฐฐ์ด ๊ธธ์ด๊ฐ 3์ด๋ฏ๋ก 3์ ๋ฐํํ๊ณ
indexPath.row ๊ฐ 0, 1, 2 ๋ฅผ ๋ฐํํ๋ฏ๋ก 3๊ฐ์ cell ํ ์คํธ์ message[0].body, message[1].body, message[2].body ๊ฐ์ ๋ฃ์ด์ง๋ค.
4. Delegate extension ๊ตฌํํ๊ธฐ
Delegate ํ๋กํ ์ฝ์ ๊ตฌํํ ๋๋ ์ฐ์ tableView.delegate ๋ฅผ self ๋ก ์ด๊ธฐํํด์ค์ผํ๋ค.
๊ทธ๋ฆฌ๊ณ UITableViewDelegate ํ๋กํ ์ฝ์ ๊ตฌํํด์ค๋ค.
๋ณธ ํ๋ก์ ํธ์์๋ didSelecRowAt ์ธ์๊ฐ ์๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ค. ์ด ํจ์๋ ํ์ด ์ ํ๋์์ ๋ ํน์ ๋์์ ์ํํ๋๋ก ๊ตฌํํ ์ ์๋ค.
์ ์ฝ๋๋ ํด๋ฆญํ ํ์ index ๊ฐ์ print ํ๋ผ๋ ๊ตฌ๋ฌธ์ ์ถ๋ ฅํ๊ฒ ํ ๋ชจ์ต์ด๋ค.
5. Cell ๊ฐ์ฒด ๋ง๋ค๊ธฐ
View ํด๋์์ Cocoa touch ํด๋์ค๋ฅผ ๋ง๋ค์ด์ค๋ค.
Cell ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ๊ฒ์ด๋ฏ๋ก ํด๋์ค ์ด๋ฆ์ MessageCell ์ด๋ผ๊ณ ํ์.
์ด ๋, ์๋ธํด๋์ค๋ UITableViewCell ๋ก ์ ์ธํ๋ค.
๋์์ธ ํ์ผ๋ ํจ๊ป ์์ฑํ๊ธฐ ์ํด Also create XIB file ์ ์ฒดํฌํด์ค๋ค.
์์ฑํ๋ฉด ์์ ๊ฐ์ด 2๊ฐ์ ํ์ผ์ด ์์ฑ๋๋ค.
UITableViewCell ์ ์์ ๋ฐ์ cocoa touch ํด๋์ค(MessageCell.swift)๋ฅผ ์ฒ์ ์์ฑํ๋ฉด ์์ ๊ฐ์ ์ฝ๋๊ฐ ์ ํ์๋ฐ.
awakeFromNib() ํจ์๋ ์ด๊ธฐํ ํจ์๋ผ๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค.
setSelected() ํจ์๋ cell ์ด ์ ํ๋์์ ๋ ํน์ ํ์๋ฅผ ๊ตฌํํ๋ ํจ์์ด๋ค.
MessageCell.xib ๋์์ธ ํ์ผ์ ์์ ๊ฐ์ด ์์ฑ๋๋ค.
์ Cell ์ ์์ ๊ฐ์ด ๊พธ๋ฉฐ๋ณด์.
MessageCell ํด๋์ค๋ฅผ ์ด์ด์ UIView, UILabel, UIImageView ๋ฅผ ์ฝ๋์ ์ฐ๊ฒฐํด์ค๋ค.
ChatViewController ํด๋์ค์ viewDidLoad() ํจ์์์ table view ์ MessageCell ์ ๋ฑ๋กํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
nibName์๋ MessageCell.swift ํ์ผ๋ช ์ ๋ฃ์ผ๋ฉด ๋๋ค. ๋๋ K ๋ฌธ์์ด ์์์ ๋ฑ๋ก๋ cellNibName(MessageCell) ์ ์ด์ฉํ์ฌ ์ฐ๊ฒฐํด์คฌ๋ค.
forCellReuseIdentifier์๋ Table View Cell ์ Identifier ๋ฅผ ๋ฃ์ผ๋ฉด ๋๋๋ฐ, K ๋ฌธ์์ด ์์์ cellIdentifier(ReusableCell) ๋ก ๋ฑ๋กํ์ฌ ์ฌ์ฉํ์๋ค.
DataSource์์ cell ์ ์์ฑํ ๋ ๋ฐฉ๊ธ ๋ง๋ MessageCell๋ก ์ฌ์ฉํด์ฃผ๊ธฐ.
UITableViewDataSource ํ๋กํ ์ฝ์ extension ์์ cell์ ๋ง๋ค์ด์ ์ฌ์ฉํ๋๋ฐ,
์ด๋์ cell์ MessageCell ํด๋์ค๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ธฐ์กด ์ฝ๋์์ as! MessageCell ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
๋ํ cell.textLabel -> cell.label ๋ก ๋ฐ๊ฟ์ค๋ค.
๊ธฐ์กด์ ์ฌ์ฉํ๋ Main.storyboard์ ์๋ ReusableCell ์ ์ญ์ ํด์ค๋ค.
[๊ฒฐ๊ณผํ๋ฉด]
์ฐธ๊ณ ๋ก ์ ์ ํด๋ฆญํ์ ๋ ํ์ ์ฒ๋ฆฌ ๋๋ ๊ฒ์ ์ ๊ฑฐ ํ๊ณ ์ถ๋ค๋ฉด, Interation ํญ์ User Interation Enabled ์ฒดํฌ๋ฐ์ค๋ฅผ ํด์ ํ๋ฉด ๋๋ค.
6. Cell ๋ฅ๊ทผ ๋ชจ์๋ฆฌ ์ฒ๋ฆฌ, ๊ธ์์ ๊ธธ์ด์ง ๋ ์งค๋ฆฌ์ง ์๊ฒ ์ฒ๋ฆฌ
awakeFromNib() ํจ์๋ ์ด๊ธฐํ ํจ์์ธ๋ฐ, messageBubble.layer.cornerRadius ์ ํน์ ๊ฐ์ ์ฃผ๋ฉด ๋ชจ์๋ฆฌ๋ฅผ ๋ฅ๊ธ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
์ ์ฝ๋๋ messabeBubble์ frame ๊ธธ์ด๋ฅผ ๊ตฌํด์ 5๋ก ๋๋ ๊ฐ์ cornerRadius ๊ฐ์ผ๋ก ๋ถ์ฌํ ๋ชจ์ต์ด๋ค.
์ฑํ ์ค์ด ๊ธธ์ด์ง ์๋ก ๊ทธ์ ๋ง์ถฐ radius ๊ฐ์ ๋ถ์ฌํด์ค์ผ ํ๊ธฐ ๋๋ฌธ.
๋ฅ๊ธ๊ฒ ์ฒ๋ฆฌ๋ ๋ชจ์ต!
์ถ๊ฐ์ ์ผ๋ก ํ ์คํธ ๊ธธ์ด๊ฐ ๊ธธ์ด์ง ๋ ์งค๋ฆผ์ฒ๋ฆฌ๋ฅผ ๋ง๊ธฐ ์ํด์๋ Label์ Lines ์์ฑ์ 0์ผ๋ก ์ฃผ๋ฉด ๋๋ค.
ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๋ฉด ๋ ๊ฐ์ด ์ปค์ง๊ณ , ํฌ๊ธฐ๋ฅผ ์ค์ด๋ฉด ๊ฐ์ด ๋ ์์์ง๋ค.