-
'νμκΈ λνΉ μ±'μ μ μνλ©΄μ λ°°μ΄ μ νκ³iOS/π€ App 2021. 3. 5. 22:41
νμκΈ λνΉ μ±μ 3λ¨κ³μ κ³Όμ μ κ±°μ³μ μ΅μ’ κ²°κ³Όλ¬Όμ΄ λμμ΅λλ€.
1. MVC ν¨ν΄μ κ°μ§κ³ ν μ΄λΈ λ·° (UITableView) μ λν μΌ λ·° (UIView) λ‘ κ΅¬μ±λ μ± μμ±νκΈ°
2. MVC ν¨ν΄μ MVVM ν¨ν΄μΌλ‘ 리ν©ν°λ§νκΈ°
3. ν μ΄λΈ λ·°λ₯Ό 컬λ μ λ·°λ‘ λ³κ²½νκ³ , λν μΌ λ·°μ μ λλ©μ΄μ μΆκ°νκΈ°
μ λ¨κ³μ μμλλ‘ μλ‘ λ°°μ°κ±°λ 볡μ΅ν μ μ κΈλ‘ λ¨κΈ°λ €κ³ ν©λλ€.
1λ¨κ³: MVC ν¨ν΄μ κ°μ§κ³ ν μ΄λΈ λ·° μ λν μΌ λ·°λ‘ κ΅¬μ±λ μ± μμ±νκΈ°
a. MVC
μ΄μ κΈμμ ν λ² λ€λ£¬ λ΄μ©μ λλ€.
MVC ν¨ν΄μ νΉμ§μ μ± λ΄μ μ€λΈμ νΈλ₯Ό 3κ°μ ν° μν (λ μ΄μ΄) λ‘ λλκ³ , μν κ° μ΄μμ μΌλ‘ μν΅νλ λ°©μμ΄ μλ€λ κ²μ λλ€.
Model, View, Contoller : View μ Model μλ μ§μ μ μΈ μ°κ²°μ±μ΄ μλ€. Controller κ° λ λ μ΄μ΄μ μ€μ¬μμ΄λ€.
κ·Έλ¦¬κ³ Controller λ μ΄μ΄μ μνλ UIViewController μ μν μ΄ λ무 λΉλν΄μ Έ 'Massive View Controller' κ° λλ€λ λ¨μ μ΄ μμ΅λλ€.
μ΄λ κ² λλ©΄ SOLID μ€ νλμΈ λ¨μΌ μ± μμ μμΉμ μ΄κΈλκΈ° λλ¬Έμ μ μ§λ³΄μμ μ½λμ μ¬μ¬μ©, ν μ€νΈκ° μ΄λ €μμ§λλ€.
b. ν μ΄λΈ λ·°
ν μ΄λΈ λ·°λ 리μ€νΈ μλ£κ΅¬μ‘°λ₯Ό νλ©΄μ ννν λ μ ν©ν View μ λλ€.
ν μ΄λΈ λ·°μ ννμ νΉμ§μ λ°λμ νλμ νμ νλμ cell λ§μ νμν μ μλ€λ κ² μ λλ€.
λν Delegation μ ν΅ν΄
1. ν μ΄λΈ λ·°μ νμν λ°μ΄ν°μ - UITableViewDataSource
2. ν μ΄λΈ λ·°μμ μ΄λ²€νΈκ° λ°μνμ λ μ²λ¦¬ν λ©μλλ₯Ό μꡬν©λλ€. - UITableViewDelegate
Delegation μ κ°μ²΄κ° μν΅νλ λ°©μ μ€ νλ μ λλ€.
κ°μ²΄κ° μν΅νλ λ°©μμ ν¬κ² 3κ°μ§κ° μμΌλ©°, Delegation, Notification, KVO λ°©μμ΄ μμ΅λλ€.
Notification, KVO λ°©μμ μΆν κΈμ ν΅ν΄ λ€λ£° μκ°μ λλ€.
λ λ€λ₯Έ νΉμ§μΌλ‘λ cell μ μ¬νμ© νλ€λ μ μ΄ μμ΅λλ€.
μ¦ νλ©΄μ cell μ νμν λλ§λ€ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό λ§λλ κ²μ΄ μλλΌ, ν λ² μ¬μ©ν cell μ λ²νΌμ λ°λ‘ μ μ₯ν΄λκ³ μ¬νμ©ν cell μ΄ μμΌλ©΄ μ¬νμ©νλ λ°©μμ λλ€.
μΈμ€ν΄μ€ λ©μλμΈ dequeReusableCell(withIdentifier:for:) λ±μ λ©μλλ‘ cellμ μ»μ μ μμ΅λλ€.
μ¬νμ©ν cell μ΄ μμ κ²½μ°μλ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄μ λ°νν©λλ€.
μ΄ νλ‘μ νΈμμλ 컀μ€ν μ μ μ¬μ©νμκΈ° λλ¬Έμ μλ μ½λμ κ°μ λ°©μμΌλ‘ νμ μΊμ€ν (as?) νμ¬ μ¬μ©νμμ΅λλ€.
μ νμ μΊμ€ν ? μ΄ λ©μλκ° λ°ννλ νμ μ UITableViewCell μ΄κΈ° λλ¬Έμ λλ€.
guard let cell = tableView.dequeueReusableCell(withReuseIdentifier: "ListCell", for: indexPath) as? ListCell else { return UITableViewCell() }
c. λν μΌ λ·°
μ΄ μ±μμλ Bounty List View Controller μ Detail View Controllerκ° Segue (μΈκ·Έμ¨μ΄) λ‘ μ°κ²°λμ΄ μμ΅λλ€.
Presentation λ°©μμ 'Present Modally' μ λλ€.
λ³΄ν΅ μ»¨νΈλ‘€κ³Ό View Controller λ₯Ό μΈκ·Έμ¨μ΄λ‘ μ°κ²°νλ©΄
컨νΈλ‘€μμ μ§μ ν μ μ μΈνμ΄ λ°μνλ©΄ μλμΌλ‘ μΈκ·Έμ¨μ΄κ° μ€ν λ©λλ€.
컨νΈλ‘€μ User Interaction μ Default λ‘ λ°λ UIVIew λ€μ λ§ν©λλ€.
νμ§λ§ VCμ VC κ°μ μΈκ·Έμ¨μ΄ μ°κ²°μ λ§ κ·Έλλ‘ VC κ°μ μ°κ²°μ±λ§ λνλΌ λΏ, Segueλ μλμΌλ‘ μ€νλμ§ μμ΅λλ€.
λ°λΌμ μνλ μμ μ performSegue(withIdentifier:sender:) μ κ°μ λ©μλλ₯Ό νΈμΆνμ¬ μΈκ·Έμ¨μ΄λ₯Ό μλμΌλ‘ μ€νμμΌμΌ ν©λλ€.
κ·Έλ¦¬κ³ VCμ VC κ°μλ μ¬λ¬ μΈκ·Έμ¨μ΄κ° μ‘΄μ¬ν μ μκΈ° λλ¬Έμ, μΈκ·Έμ¨μ΄λ§λ€ identifier λ₯Ό μ§μ ν΄ μ€λλ€.
μλ₯Ό λ€μ΄ performSegue(withIdentifier:sender:) λ©μλλ 첫λ²μ§Έ νλΌλ―Έν°λ‘ μ΄ identifier λ₯Ό μꡬν©λλ€.
perfromSegue(withIdentifier:sender) λ©μλκ° μ€νλλ©΄ μ°κ²°λμ΄μλ λ€μ VC κ° νλ©΄μ λνλκΈ° μ§μ μ
prepare(for:sender:) λ©μλκ° νΈμΆ λ©λλ€.
prepare(for:sender:) λ©μλμ μνμλ μλ¬΄λ° μ½λκ° λ€μ΄μμ§ μμ΅λλ€.
λ°λΌμ μ€λ²λΌμ΄λ ν΄μ μνλ λλ‘ κ΅¬ν ν©λλ€.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard segue.identifier == "detailView", let sender = sender as? Int else { return } guard let vc = segue.destination as? DetailViewController else { return } vc.name = nameList[sender] vc.bounty = bountyList[sender] }
첫λ²μ§Έ νλΌλ―Έν°λ‘ μ λ¬λ segue λ μ€νλ μΈκ·Έμ¨μ΄μ μ°Έμ‘°λ₯Ό κ°μ§κ³ μμ΅λλ€.
identifier, source, destination μμ±μ μ μ νκ² μ¬μ©νμ¬ λ κ°μ²΄ (VC) κ°μ λ°μ΄ν° μ λ¬μ ν μ μμ΅λλ€.
μ¬κΈ°μ source μ destination μ UIViewController νμ μ΄λ―λ‘ λ§λ ν΄λμ€λ‘ νμ μΊμ€ν ν΄μ£Όμ΄μΌ ν©λλ€.
λλ²μ§Έ νλΌλ―Έν°λ‘ μ λ¬λ sender λ perfromSegue(withIdentifier:sender) μ νΈμΆν λ μ λ¬ν sender μ κ°μ λ°μ΄ν° μ λλ€.
μ μ½λμμλ indexPath.row λ₯Ό μ λ¬νμκ³ , Any? νμ μΌλ‘ λ°μκΈ° λλ¬Έμ μ¬μ©νκΈ° μν΄ Int λ‘ νμ μΊμ€ν ν΄μ£Όμμ΅λλ€.
λ!
λ€μ κΈ:
'iOS > π€ App' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[iOS] KVO λ? (Key Value Observing) (0) 2021.05.22 [iOS] - Cocoa Touch μμ JSON λ€λ£¨κΈ° (0) 2021.05.07 [UIKit] λ·° νκΉ μ¬μ©ν΄λ³΄κΈ° (View Tagging) (0) 2021.03.05 [iOS] MVC λ? (feat. Cocoa MVC) (0) 2021.03.03 [iOS] Frame κ³Ό Bounds μ 곡ν΅μ κ³Ό μ°¨μ΄μ (0) 2021.02.04