λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍎 iOS/UIKit

[iOS/Swift] TableView 둜 μ΄ˆκ°„λ‹¨ TodoList λ§Œλ“€κΈ°

by Danna 2021. 3. 1.
728x90
728x90

이전에 ν¬μŠ€νŒ…ν•œ UITableView, UITableViewCell, Protocols 을 μ΄μš©ν•΄μ„œ 앱을 μ‹€μ œλ‘œ λ§Œλ“€μ–΄λ³Όκ²Œμš”.
κ³΅μ‹λ¬Έμ„œλ₯Ό 보고 μ •λ¦¬ν–ˆλ˜ λ‚΄μš©λ“€μ΄λΌ μ–΄λ ΅κ²Œ μž‘μ„±ν•œκ²ƒ κ°™μ•„μ„œ μ‹€μŠ΅μœΌλ‘œ ν•œ 번 더 ν™˜κΈ°ν•˜λ €κ³  ν•©λ‹ˆλ‹€!

개발 μˆœμ„œλŠ” λ‹€μŒκ³Ό κ°™μ•„μš” πŸ™‚

  1. Storyboard μ—μ„œ TableView μΆ”κ°€ν•˜κΈ°
  2. TableView 내에 TableCell ꡬ성 λ§Œλ“€κΈ°
  3. CustomCell 클래슀 λ§Œλ“€κ³  μ—°κ²°ν•˜κΈ°
  4. TableView Protocol μ€€μˆ˜ν•˜κΈ°
  5. μ•± μ‹€ν–‰ν•˜κΈ°

1. Storyboard μ—μ„œ TableView μΆ”κ°€ν•˜κΈ°

μŠ€ν† λ¦¬λ³΄λ“œλ₯Ό μ΄μš©ν•΄μ„œ UI κ°œλ°œμ„ μ§„ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. TableView 와 TableViewCell 을 μΆ”κ°€ν•΄μ€λ‹ˆλ‹€!

2. TableView 내에 TableCell ꡬ성 λ§Œλ“€κΈ°

Table View 내뢀에 Table View Cell 을 μΆ”κ°€ν•΄μ£Όκ³ , Cell 내뢀에 Button, Label 을 μΆ”κ°€ν•΄μ£Όμ—ˆμ–΄μš”. Auto layout 을 ν†΅ν•΄μ„œ λ ˆμ΄μ•„μ›ƒ 쑰정도 ν•΄μ€€ μƒνƒœμž…λ‹ˆλ‹€.

μ—¬κΈ°μ„œ λ²„νŠΌμ€ μ‹œμŠ€ν…œ 이미지λ₯Ό μ΄μš©ν–ˆκ³ , Default μƒνƒœμ—μ„œλŠ” circle, Selected μƒνƒœμ—μ„œλŠ” checkmark.circle.fill 둜 μ„€μ •ν–ˆμ–΄μš”.

3. CustomCell 클래슀 λ§Œλ“€κ³  μ—°κ²°ν•˜κΈ°

UITableViewCell 을 μƒμ†λ°›λŠ” Custom Class λ₯Ό λ§Œλ“€μ–΄μ£Όκ³ , μŠ€ν† λ¦¬λ³΄λ“œμ—μ„œ Cell 의 inspector μ—μ„œ 지정을 ν•΄μ£Όμ–΄μ•Όν•©λ‹ˆλ‹€. TodoCell μ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ λ§Œλ“€μ—ˆκ³ , μ•„λž˜ 두 곳에 μž‘μ„±ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.

Custom Class λŠ” UITableViewCell 을 λ§Œλ“ κ²ƒμ— λŒ€ν•œ 지정이고, Identifier λŠ” Cell 을 μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” μ‹λ³„μžμž…λ‹ˆλ‹€.

μŠ€ν† λ¦¬λ³΄λ“œμ—μ„œ Assistant 둜 μ½”λ“œμ°½μ„ ν•¨κ»˜ μ—΄μ–΄μ„œ, λ²„νŠΌκ³Ό 라벨을 checkButtonκ³Ό todoLabel 으둜 outlet 을 λ§Œλ“€μ–΄μ€μ‹œλ‹€. 데이터λ₯Ό 톡해 각 μ…€μ˜ Label 을 지정해주기 μœ„ν•¨μž…λ‹ˆλ‹€.

μ—¬κΈ°μ„œ checkButtonTapped method λŠ” λ²„νŠΌμ΄ λˆŒλ Έμ„ λ•Œ, λΌλ””μ˜€λ²„νŠΌμ²˜λŸΌ 체크가 되기 μœ„ν•΄ λ²„νŠΌμ˜ isSelected 속성이 ν† κΈ€λ˜λ„λ‘ μ½”λ“œλ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

4. TableView Protocol μ€€μˆ˜ν•˜κΈ°

μ½”λ“œμ—μ„œ ViewController κ°€ UITableViewDataSource ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œλ‹€λŠ” 것을 λͺ…μ‹œν•΄μ€λ‹ˆλ‹€. 이전 κΈ€μ—μ„œ μž‘μ„±ν–ˆλ“―μ΄, ν•„μˆ˜μΈ 두 개의 ν•¨μˆ˜ tableView(_:numberOfRowsInSection:), tableView(_:cellForRowAt:) λ₯Ό μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

μ€‘μš”ν•œμ—­ν• ! μŠ€ν† λ¦¬λ³΄λ“œμ—μ„œ TableView -> View Controller 둜 컨트둀+λ“œλž˜κ·Έ ν•˜μ—¬ dataSource, delegate λ₯Ό μ—°κ²°ν•΄μ€˜μ•Όν•©λ‹ˆλ‹€.


tableView(_:numberOfRowsInSection:) λŠ” νŠΉμ • section 에 ν‘œμ‹œν•  row 의 개수λ₯Ό λ¬»λŠ” method μž…λ‹ˆλ‹€. μ§€κΈˆμ€ section 이 ν•˜λ‚˜λ°–μ— μ—†λŠ” μ˜ˆμ œμ΄λ―€λ‘œ todos 리슀트의 개수λ₯Ό λ°˜ν™˜ν–ˆμŠ΅λ‹ˆλ‹€.

tableView(_:cellForRowAt:) λŠ” cell 을 μ–΄λ–»κ²Œ ν‘œν˜„ν• μ§€μ— λŒ€ν•΄ λ¬»λŠ” method μž…λ‹ˆλ‹€.

cell 을 κ°€μ Έμ˜€κΈ° μœ„ν•œ 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • tableView.dequeueReusableCell(withIdentifier: ) ν•¨μˆ˜λ₯Ό ν†΅ν•΄μ„œ TodoCell 을 κ°€μ Έμ˜΅λ‹ˆλ‹€.
  • as? TodoCell 을 ν†΅ν•΄μ„œ TodoCell 둜 λ‹€μš΄μΊμŠ€νŒ…ν•©λ‹ˆλ‹€.
  • if let else ꡬ문을 ν†΅ν•΄μ„œ λ‹€μš΄μΊμŠ€νŒ…μ΄ λ˜μ§€ μ•Šμ€ 경우, λΉ„μ–΄μžˆλŠ” UITableViewCell() 을 λ°˜ν™˜ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.
  • μ„±κ³΅μ μœΌλ‘œ λ‹€μš΄μΊμŠ€νŒ…μ΄ λ˜μ—ˆλ‹€λ©΄, cell 은 TodoCell instance κ°€ λ©λ‹ˆλ‹€.

cell 을 κ°€μ Έμ˜¨ ν›„, 데이터λ₯Ό 톡해 cell 을 update ν•˜κΈ° μœ„ν•œ λ°©λ²•μž…λ‹ˆλ‹€.

  • indexPath λŠ” section, row 값을 κ°€μ§€λ―€λ‘œ, row λ₯Ό index 에 ν• λ‹Ήν•΄μ€λ‹ˆλ‹€.
  • 미리 λ§Œλ“€μ–΄λ‘” todos 리슀트의 index 에 ν•΄λ‹Ήν•˜λŠ” 값을 todoLabel.text κ°’μœΌλ‘œ ν• λ‹Ήν•΄μ€€λ‹€.

cell 을 update ν•œ ν›„, cell 을 λ°˜ν™˜ν•˜λ©΄ λ©λ‹ˆλ‹€!

5. μ•± μ‹€ν–‰ν•˜κΈ°

λͺ¨λ‘ μ™„λ£Œν•œ μƒνƒœμ—μ„œ 앱을 μ‹€ν–‰ν•˜λ©΄ μ •μƒμ μœΌλ‘œ ν…Œμ΄λΈ”λ·°κ°€ λ‚˜νƒ€λ‚˜λ©°, λ²„νŠΌμ„ 톡해 체크할 수 μžˆμŠ΅λ‹ˆλ‹€!

μ΄ˆκ°„λ‹¨ νˆ¬λ‘λ¦¬μŠ€νŠΈμ˜€κΈ° λ•Œλ¬Έμ—, Section 도 μ—†κ³  μ‚­μ œλ‚˜ λ””ν…ŒμΌ νŽ˜μ΄μ§€λ„ μ—†μ§€λ§Œ 도움이 λ˜μ…¨μœΌλ©΄ μ’‹κ² μŠ΅λ‹ˆλ‹€ :D

λ‹€μŒμ— 글을 μ—…λ°μ΄νŠΈ ν•˜κ²Œλœλ‹€λ©΄ row λ₯Ό μŠ€μ™€μ΄ν”„ν•΄μ„œ μ‚­μ œν•˜λŠ” κ²ƒκΉŒμ§€ μ—…λ°μ΄νŠΈ ν•΄λ³Όκ²Œμš”!


μ°Έκ³  λ¬Έμ„œ

μΆ”μ²œ κ°€μ΄λ“œ

728x90
728x90