์ƒˆ์†Œ์‹

๐Ÿ“ฑ iOS/-- UIKit

(iOS) ํ…Œ์ด๋ธ” ๋ทฐ (TableView)

  • -

TableView

TableView์˜ ๋ฐ์ดํ„ฐ ํ‘œํ˜„ ๋ฐฉ์‹

TableView๋Š” ํ‘œ๋ฉด์ ์œผ๋กœ๋Š” ๋‹จ์ˆœํžˆ ๋ชฉ๋ก ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ณด๋ฉด ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์ด๋ฃจ๋Š” ์ฝ˜ํ…์ธ ์˜ ์ƒ์œ„ ์นดํ…Œ๊ณ ๋ฆฌ๋“ค์„ ์ •๋ ฌํ•˜์—ฌ ํ‘œํ˜„ํ•ด์ฃผ๋ฉฐ, ๊ทธ ์†์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ํ•ญ๋ชฉ์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

๋„ค๋น„๊ฒŒ์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ์™€ ํ…Œ์ด๋ธ” ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๊ณ„์ธต์  ์„ฑ๊ฒฉ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ์— ์•Œ๋งž๊ณ , ์„œ๋กœ ์ƒํ˜ธ ๋ณด์™„์ ์ธ ์—ญํ• ์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ๋„ค๋น„๊ฒŒ์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ˆ˜์ง์ ์ธ ์ •๋ณด๋“ค์„ ์ง๋ ฌ๋กœ ํ‘œํ˜„ํ•˜๋ฉฐ, ํ…Œ์ด๋ธ”๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ˆ˜ํ‰์ ์ธ ์ •๋ณด๋“ค์„ ๋ณ‘๋ ฌ๋กœ ๋ฐฐ์—ดํ•˜๊ฒŒ๋œ๋‹ค.

TableView์˜ ๊ณ„์ธต๊ตฌ์กฐ

  1. TableView Controller
    • ViewController๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ํŠน์ˆ˜ํ•œ ์ปจํŠธ๋กค๋Ÿฌ์ด๋‹ค.
    • ํ™”๋ฉด ์ „์ฒด๋ฅผ ๋ชฉ๋กํ˜•์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ผ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
    • ํ•˜๋‚˜์˜ ์”ฌ์€ ํ•˜๋‚˜์˜ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ TableViewController๊ฐ€ ์žˆ์œผ๋ฉด ViewController๋Š” ํ•„์š”๊ฐ€ ์—†๋‹ค.
  2. Table View
    • TableViewController์˜ ๋ฃจํŠธ ๋ทฐ์ด๋‹ค. ๋ชฉ๋ก ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” View์ด๋‹ค.
    • ์ผ๋ฐ˜ ViewContorller์— TableView๊ฐ์ฒด๋งŒ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.
  3. Table View Cell
    • Table View๋Š” ๋ชฉ๋ก์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ์ฒด์ด๊ณ , Table View Cell์€ ๋ชฉ๋ก ์•ˆ์— ๋“ค์–ด๊ฐˆ ํ–‰๋“ค์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ทฐ์ด๋‹ค.
  4. Content View
    • Cell(ํ•˜๋‚˜ํ•˜๋‚˜์˜ ํ–‰) ๋‚ด๋ถ€์— ๋“ค์–ด๊ฐˆ ์ฝ˜ํ…์ธ ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” Veiw์ด๋‹ค.

Prototype Cell

Cell์„ ์‰ฝ๊ฒŒ ๋””์ž์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ํ‹€๋งŒ ์ œ๊ณตํ•ด์ฃผ๊ณ , ๋‚ด๋ถ€์— ๋ฒ„ํŠผ์ด๋‚˜ ํ…์ŠคํŠธ ๋ ˆ์ด๋ธ”๋“ฑ์ด ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์™ผ์ชฝ์— Title ๋ ˆ์ด๋ธ”์ด ์ฐจ์ง€ํ•˜๋Š” ๊ณต๊ฐ„์ด Cell Content์˜์—ญ์ด๊ณ , ์˜ค๋ฅธ์ชฝ์— ๋ฒ„ํŠผ์ด ์žˆ๋Š” ๋ถ€๋ถ„์„ Accessory View๋ผ๊ณ  ํ•œ๋‹ค.

ํ‘œ์ค€ ํŽธ์ง‘ ์ธํ„ฐํŽ˜์ด์Šค

์ฝ”์ฝ”์•„ ํ„ฐ์น˜ ํ”„๋ ˆ์ž„์›Œํฌ์—๋Š” ํ”„๋กœํ† ํƒ€์ž… ์…€์— ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ํ‘œ์ค€ ํŽธ์ง‘ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” Reordering Control ์„ ํ†ตํ•ด ์ˆœ์„œ๋ฅผ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๊ณ , ์™ผ์ชฝ์˜ Editting Control ์˜์—ญ์˜ ๋ฒ„ํŠผ์„ ํ†ตํ•ด ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

DataSource

TableVeiw์˜ ๋ฐ์ดํ„ฐ ํ‘œํ˜„ ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์ •์  ํƒ€์ž…, ๋™์  ํƒ€์ž….

ํ…Œ์ด๋ธ” ๋ทฐ๋ฅผ ํ†ตํ•ด ํ‘œํ˜„ํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋งค๋ฒˆ ๊ฐฑ์‹ ๋˜๋Š” ๋™์ ์ธ ํƒ€์ž…์ด๋ผ๋ฉด, Dynamic Prototypes๋ฅผ ์„ ํƒํ•ด์•ผํ•˜๋ฉฐ, dataSource๊ฐ€ ํ•„์š”ํ•˜๋‹ค. dataSource์™€ ํ…Œ์ด๋ธ” ๋ทฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค.

๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ (TableView์™€ DataSource ์—ฐ๊ฒฐ)

UITableViewDataSource๋ผ๋Š” ํ”„๋กœํ† ์ฝœ์— ์˜์กดํ•˜์—ฌ ์—ฐ๋™๋œ๋‹ค. ์•„๋ž˜์˜ ๋‘๊ฐ€์ง€ ๋‚ด์šฉ์„ ํ•„์ˆ˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋‚˜ํƒ€๋‚ธ๋‹ค.

  • TableViewController๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ž๋™์œผ๋กœ ๋ฉ”์†Œ๋“œ๊ฐ€ ํด๋ž˜์Šค๋‚ด๋ถ€์— ์ถ”๊ฐ€๋˜์–ด์žˆ๋‹ค.
  • ViewController์—์„œ extension๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด UITableViewDelegate UITableViewDataSource๋ฅผ ํ•ด์ฃผ๋ฉด ๋นจ๊ฐ„ ๊ฒฝ๊ณ ๋ฒ„ํŠผ์ด ๋œจ๋Š”๋ฐ, ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋œ๋‹ค.
  1. ํ…Œ์ด๋ธ”์ด ๋ช‡ ๊ฐœ์˜ ํ–‰์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š”๊ฐ€? -> tableView(_:numberOfRowInSection:)
    • ํ…Œ์ด๋ธ” ๋ทฐ๊ฐ€ ์ƒ์„ฑํ•ด์•ผ ํ•  ์…€ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ์€ ๋ช‡๊ฐœ์˜ ํ–‰์„ ์ƒ์„ฑํ• ์ง€ ์ •ํ•œ๋‹ค.
  2. ํ…Œ์ด๋ธ”๋ทฐ์˜ ๊ฐ ์…€์€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”๊ฐ€? -> tableView(_:cellForRowAt:)
    • ์…€ ํ•˜๋‚˜ํ•˜๋‚˜์— ๋Œ€ํ•ด ๊ณ„์† ํ˜ธ์ถœ๋˜๊ฒŒ ๋œ๋‹ค.
    • ์…€ ๋‚ด๋ถ€์— ๋“ค์–ด๊ฐˆ ์ฝ˜ํ…์ธ ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ๊ทธ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (์…€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค)

์‚ฌ์šฉ์ž ์•ก์…˜ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ

tableView(_:didSelectRowAt:) ๋ฉ”์†Œ๋“œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ…Œ์ด๋ธ” ๋ทฐ์—์„œ ํŠน์ • ์…€์„ ํ„ฐ์น˜ํ–ˆ์„๋•Œ ํ˜ธ์ถœ๋œ๋‹ค.

์ฆ‰, ํŠน์ • ์…€์„ ์„ ํƒํ–ˆ์„๋•Œ detail ๋‚ด์šฉ์„ ํ‘œ์‹œํ•˜๋Š” ํ™”๋ฉด์œผ๋กœ ์ „ํ™˜ํ•œ๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ• ๋•Œ ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ์ด๋‹ค. ๋ช‡ ๋ฒˆ์งธ ์…€์„ ์„ ํƒํ–ˆ๋Š”์ง€ indexPath ์˜ .row๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๊ณ , ์ด ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์— ์…€ ์„ ํƒ์‹œ ๋™์ž‘ํ•  ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

ReusableCell

iOS์‹œ์Šคํ…œ์€ ์ˆ˜ ๋งŽ์€ ํ…Œ์ด๋ธ” ๋ทฐ์˜ ์…€์—๋Œ€ํ•œ ๊ฐ์ฒด๋“ค์„ ์ผ์ผ์ด ๋‹ค ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด, ๋‹น์žฅ์˜ ํ™”๋ฉด์— ํ‘œ์‹œ๋  ๋งŒํผ๋งŒ ์…€์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์…€์…€ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ธ ์žฌ์‚ฌ์šฉ ํ๋ฅผ ๋งŒ๋“ค์–ด ๋‘๊ณ  ํ•„์š”ํ• ๋•Œ ๊บผ๋‚ด์–ด ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•„์š”๊ฐ€ ์—†์–ด์ง„ ์…€์€ ๋‹ค์‹œ ์žฌ์‚ฌ์šฉ ํ์— ์ €์žฅ๋œ๋‹ค.

์ฆ‰, ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋งํ•˜์ž๋ฉดdequeueReusableCell(withIdentifier:) ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ ๋˜์—ˆ์„๋•Œ ์ž…๋ ฅ๋œ ์•„์ด๋””์— ๋งž๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์žฌ์‚ฌ์šฉ ํ์— ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ธ์Šคํ„ด์Šค๋ฅผ ๊บผ๋‚ด์–ด ์žฌ์‚ฌ์šฉํ•˜๊ณ , ์—†๋‹ค๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์—ฌ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

ํ”„๋กœํ† ํƒ€์ž…์…€์˜ ๊ฐ์ฒด ์ œ์–ดํ•˜๊ธฐ

ํ”„๋กœํ† ํƒ€์ž…์…€์€ ์…€ ๋‚ด๋ถ€์— ์žˆ๋Š” ๋ ˆ์ด๋ธ”, ์ด๋ฏธ์ง€ ๋ทฐ ๋“ฑ์˜ ํ™”๋ฉด์š”์†Œ๋ฅผ ์†Œ์Šค์ฝ”๋“œ์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘๊ฐ€์ง€์ด๋‹ค.

(1) Tag๊ฐ’ ์‚ฌ์šฉํ•˜๊ธฐ viewWithTag(_:)

  • ์ •์ˆ˜๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค
  • ๊ตฌํ˜„์ด ์‰ฝ๋‹ค. ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ธ์ŠคํŽ™ํ„ฐ์—์„œ Tag๋ฒˆํ˜ธ๋ฅผ ๋ถ™์—ฌ์ค€ ๋’ค์— ์†Œ์Šค์ฝ”๋“œ์—์„œ cell.viewWithTag(<ํƒœ๊ทธ๋ฒˆํ˜ธ>)๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • cell.viewWithTag๋ฉ”์†Œ๋“œ๋Š” ๋ฐ˜ํ™˜ํƒ€์ž…์ด UIView์ด๋ฏ€๋กœ, ํ•ด๋‹น ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๋กœ ๋‹ค์šด์บ์ŠคํŒ… ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด label ์ด๋ผ๋ฉด <์ฐธ์กฐํ•œ ๊ฐ์ฒด> as? UILabel
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
            let label = cell.viewWithTag(10) as? UILabel
            label?.text = dataSet[indexPath.row]
            return cell
        }
    }

์•„์›ƒ๋ › ๋ณ€์ˆ˜ ์—ฐ๊ฒฐํ•˜์—ฌ ์ฐธ์กฐํ•˜๊ธฐ (์ปค์Šคํ…€ ํด๋ž˜์Šค ๊ตฌํ˜„ํ•˜๊ธฐ)

  • ํ”„๋กœํ† ํƒ€์ž… ์…€์„ ์ œ์–ดํ•  ์ปค์Šคํ…€ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.
  • 1๋ฒˆ ๋ณด๋‹ค ๊ตฌํ˜„์ด ์–ด๋ ต์ง€๋งŒ, ์ถ”ํ›„ ๊ด€๋ฆฌ๋Š” ๋” ํŽธํ•˜๋‹ค.
  1. ํด๋ž˜์Šค ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ค€๋‹ค.
import UIKit
class TableViewCell: UITableViewCell {
    @IBOutlet weak var imgView: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var priceLabel: UILabel!
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }
}
  1. ์Šคํ† ๋ฆฌ๋ณด๋“œ์˜ ์…€์—์„œ ๋ฐฉ๊ธˆ ์ƒ์„ฑํ•œ ํด๋ž˜์ŠคํŒŒ์ผ์„ ์ง€์ •ํ•˜์—ฌ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.

  1. ์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ ์…€์˜ ๊ฐ์ฒด๋“ค์„ ์•„์›ƒ๋ › ๋ณ€์ˆ˜๋กœ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค. (๋‹น์—ฐํžˆ ๋ฐฉ๊ธˆ๋งŒ๋“  ์ปค์Šคํ…€ ์…€ ํด๋ž˜์Šค์—)
  2. ViewController ํŒŒ์ผ๋กœ ๋Œ์•„๊ฐ€์„œ,tableView(_:cellForRowAt: ๋ฉ”์†Œ๋“œ์—์„œ cell์„ ์„ ์–ธํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ฐฉ๊ธˆ ์ƒ์„ฑํ•œ ์ปค์Šคํ…€ ์…€ ํด๋ž˜์Šค๋กœ ๋‹ค์šด์บ์ŠคํŒ…์„ ํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ๋ ˆ์ด๋ธ” ๋“ฑ ๊ฐ View์— ๋Œ€ํ•œ ์†์„ฑ์„ ์ž‘์„ฑํ•˜๋ฉด๋œ๋‹ค.
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = pizzaTableView.dequeueReusableCell(withIdentifier: "pizzaCell") as! TableViewCell
            cell.nameLabel.text = "PIZZA"
      return cell
    }
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.