๐Ÿ“ฑ App Development Study/iOS๐ŸŽ

[Udemy iOS & Swift Bootcamp] Table View(DataSource, Delegate)

ibelieveinme 2023. 6. 27. 23:34
728x90

 

์ฑ„ํŒ… ์ฐฝ์—์„œ ์ฑ„ํŒ… ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด 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๋กœ ์‚ฌ์šฉํ•ด์ฃผ๊ธฐ.

Before
After

UITableViewDataSource ํ”„๋กœํ† ์ฝœ์˜ extension ์—์„œ cell์„ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ,

์ด๋•Œ์˜ cell์„ MessageCell ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๊ธฐ์กด ์ฝ”๋“œ์—์„œ as! MessageCell ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋˜ํ•œ cell.textLabel -> cell.label ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

 

Before -> After

๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ Main.storyboard์— ์žˆ๋Š” ReusableCell ์€ ์‚ญ์ œํ•ด์ค€๋‹ค.

 

[๊ฒฐ๊ณผํ™”๋ฉด]

 

์ฐธ๊ณ ๋กœ ์…€์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ํšŒ์ƒ‰ ์ฒ˜๋ฆฌ ๋˜๋Š” ๊ฒƒ์„ ์ œ๊ฑฐ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, Interation ํƒญ์˜ User Interation Enabled ์ฒดํฌ๋ฐ•์Šค๋ฅผ ํ•ด์ œํ•˜๋ฉด ๋œ๋‹ค.

 

6. Cell ๋‘ฅ๊ทผ ๋ชจ์„œ๋ฆฌ ์ฒ˜๋ฆฌ, ๊ธ€์ž์ˆ˜ ๊ธธ์–ด์งˆ ๋•Œ ์งค๋ฆฌ์ง€ ์•Š๊ฒŒ ์ฒ˜๋ฆฌ

awakeFromNib() ํ•จ์ˆ˜๋Š” ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜์ธ๋ฐ, messageBubble.layer.cornerRadius ์— ํŠน์ • ๊ฐ’์„ ์ฃผ๋ฉด ๋ชจ์„œ๋ฆฌ๋ฅผ ๋‘ฅ๊ธ€๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„ ์ฝ”๋“œ๋Š” messabeBubble์˜ frame ๊ธธ์ด๋ฅผ ๊ตฌํ•ด์„œ 5๋กœ ๋‚˜๋ˆˆ ๊ฐ’์„ cornerRadius ๊ฐ’์œผ๋กœ ๋ถ€์—ฌํ•œ ๋ชจ์Šต์ด๋‹ค.

์ฑ„ํŒ… ์ค„์ด ๊ธธ์–ด์งˆ ์ˆ˜๋ก ๊ทธ์— ๋งž์ถฐ radius ๊ฐ’์„ ๋ถ€์—ฌํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ.

 

 ๋‘ฅ๊ธ€๊ฒŒ ์ฒ˜๋ฆฌ๋œ ๋ชจ์Šต!

 

์ถ”๊ฐ€์ ์œผ๋กœ ํ…์ŠคํŠธ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์งˆ ๋•Œ ์งค๋ฆผ์ฒ˜๋ฆฌ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ๋Š” Label์˜  Lines ์†์„ฑ์„ 0์œผ๋กœ ์ฃผ๋ฉด ๋œ๋‹ค.

ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฌ๋ฉด ๋” ๊ฐ์ด ์ปค์ง€๊ณ , ํฌ๊ธฐ๋ฅผ ์ค„์ด๋ฉด ๊ฐ์ด ๋” ์ž‘์•„์ง„๋‹ค.

728x90