[iOS] UITableView + UITableViewCell (4): 컀μ€ν UITableViewCell
컀μ€ν μ μ λ§λ€μ΄λ³΄μ
μ§λ ν¬μ€νΈκΉμ§ ν μ΄λΈ λ·°λ₯Ό λ§λ€μ΄ μ μ μΌλ‘ μ μ μ λ ₯ν΄ λ£λ λ², ν μ΄λΈ λ·° 컨νΈλ‘€λ¬ ν΄λμ€λ₯Ό μλ‘ μμ±ν΄μ λ°μ΄ν°λ₯Ό μλμΌλ‘ μ λ‘ λ£λ κ³Όμ , κ·Έλ¦¬κ³ κ·Έ μμμ μ¬μ©λλ data sourceμ κ°λ κ³Ό μ μ μ¬μ¬μ©μ λν΄ μ 리ν΄λ³΄μμ΅λλ€. μ΄μ ν μ΄λΈ λ·°μ λ§μ§λ§ μ리μ¦μΈλ°μ, μ€λμ λͺ©νλ UITableViewCellμ 컀μ€ν ν΄λμ€λ₯Ό λ§λ€μ΄μ λ μ μ°νκ² μ μ ꡬμ±νλ λ°©λ²μ μ 리ν΄λ³΄κ² μ΅λλ€.
μμ λ€μ΄ μ΄μ ν¬μ€νΈλ€μμ μ΄μ΄μ§λλ€! νΉν μ΄ ν¬μ€νΈλ₯Ό μ½μ§ μμΌλ©΄ μμ κ° μ΄ν΄κ° μ ν μλ μλ μμ΄μ! κ·ΈλΌ μμνκ² μ΅λλ€~!
μ§λ ν¬μ€νΈμμλ μ΄λ° λͺ¨μμΌλ‘ ν μ΄λΈ λ·°λ₯Ό ꡬμ±νμλλ°μ, μ¬μ€ ν κ°μ§ λΉ μ§ κ²μ΄ μμμ΅λλ€.
μ¬κΈ°μ 보μ΄λ μ/λ°μ μμΌμ΄ λΉ μ Έμμμ΅λλ€..! μ ν¬λ ν μ΄λΈ λ·°μμ ν μ€νΈλ₯Ό λ£μ΄μ£ΌκΈ° μν΄μ ContentConfigutrationμ textμ secondary textλ₯Ό μ¬μ©νμμ΅λλ€. κ·Έλ°λ° μ΄λ κ² νλ©΄ μμΌ λ μ΄λΈμ μΆκ°ν μκ° μμ΄μ.. κ·Έλμ 컀μ€ν μ μ λ§λ€μ΄μ λ΄λΆμ λ μ΄λΈ μΈ κ°λ₯Ό ν¬ν¨νλ μ μ λ§λ€μ΄λ³΄κ² μ΅λλ€.
ν΄λμ€ μΆκ°νκΈ°
λ¨Όμ 컀μ€ν μ μ μν ν΄λμ€λ₯Ό μΆκ°ν΄μ£Όκ² μ΅λλ€.
νΌμ λ§λ€κΈ°μμ Cocoa Touch Classλ₯Ό μ ννκ³ μ,
UITableViewCellμ μμνλ ν΄λμ€λ₯Ό μΆκ°ν©λλ€!
μ΄λ κ² μλ‘μ΄ ν΄λμ€κ° μΆκ°λμλλ°μ, λ κ°μ λ©μλκ° κΈ°λ³Έμ μΌλ‘ μμ±λμ΄ μμ΅λλ€. setSelectedλ μ μ΄ μ νλμμ λμ λμμ μ§μ νλ κ² κ°μ£ ? κ·Έλ°λ° awakeFromNib()μ λκΉμ? μ£Όμμ 보λ μ΄κΈ°ν μ½λμΈ κ² κ°μλ° λ μμΈν μμ보기 μν΄μ μ΄λ²μλ μμ 곡μλ¬Έμλ₯Ό μ°Ύμλ΄€μ΅λλ€!
awakeFromNib μμ보기
https://developer.apple.com/documentation/objectivec/nsobject/1402907-awakefromnib
π‘ The nib-loading infrastructure sends an awakeFromNib message to each object recreated from a nib archive, but only after all the objects in the archive have been loaded and initialized. When an object receives an awakeFromNib message, it is guaranteed to have all its outlet and action connections already established.
nibλ νλ©΄μ ꡬμ±νλ ν΄λμ€λ€μ XMLλ‘ μ μν XIBλ₯Ό μ»΄νμΌν νμΌμΈλ°μ, nibκ° μμΉ΄μ΄λΈ λμ΄μλ€κ° κ°μ²΄λ‘ μμ±λ λ μμΉ΄μ΄λΈμ ν¬ν¨λ λͺ¨λ κ°μ²΄κ° μμ±λκ³ μ΄κΈ°νλλ©΄ awakeFromNib λ©μμ§λ₯Ό λ΄λΆμ μΌλ‘ κ°μ²΄λ€μκ² λ³΄λΈλ€κ³ ν©λλ€. μ¬κΈ°μ μμΉ΄μ΄λΈλ μ΄λ€ ν΄λμ€μ κ·Έ ν΄λμ€μ μ°Έμ‘° κ΄κ³μ μλ ν΄λμ€κΉμ§ κ·Έλνλ‘ λ¬Άμ΄μ μ μ₯(μμΉ΄μ΄λΉ)νλ κ²μ μλ―Έν©λλ€. κ°μ²΄λ€μ΄ μ΄ λ©μμ§λ₯Ό λ°μΌλ©΄ μμ μ΄ κ°μ§κ³ μλ μμλ λ³μμ μ‘μ λ©μλκ° λͺ¨λ μ°κ²°λμ΄ μμμ 보μ₯νκ² λ©λλ€. κ°λ¨ν λ§ν΄μ awakeFromNibμ νλ©΄μ 보μ΄λ μ 보λ€μ λ΄μ κ°μ²΄κ° μμ±&μ΄κΈ°νλ₯Ό λͺ¨λ μλ£ν λ€μ νΈμΆλλ λ©μλλΌκ³ ν μ μμ΅λλ€!
π‘ You must call the super implementation of awakeFromNib to give parent classes the opportunity to perform any additional initialization they require. Although the default implementation of this method does nothing, many UIKit classes provide non-empty implementations. You may call the super implementation at any point during your own awakeFromNib method.
awakeFromNibμ λ°λμ superκ° κ°μ§κ³ μλ λ©μλλ ν¨κ» νΈμΆν΄μΌ ν©λλ€. λ§μ UIKit ν΄λμ€λ€μ΄ μ¬κΈ°μ μ½λλ₯Ό ν¬ν¨νκ³ μλ€κ³ νλ€μ. 컀μ€ν ν΄λμ€λ€μ λλΆλΆ UIKit ν΄λμ€λ€μ μμνκΈ° λλ¬Έμ λ°λμ νΈμΆν΄μΌκ² λ€μ.
π‘ During the instantiation process, each object in the archive is unarchived and then initialized with the method befitting its type. Objects that conform to the NSCoding protocol (including all subclasses of UIView and UIViewController) are initialized using their initWithCoder: method. All objects that do not conform to the NSCoding protocol are initialized using their init method. After all objects have been instantiated and initialized, the nib-loading code reestablishes the outlet and action connections for all of those objects. It then calls the awakeFromNib method of the objects. For more detailed information about the steps followed during the nib-loading process, see Nib Files in Resource Programming Guide.
κ°μ²΄λ€μ μΈμ€ν΄μ€κ° μμ±λκ³ awakeFromNibμ΄ λΆλ¦¬κΈ°κΉμ§μ κ³Όμ μ λν λ μμΈν μ€λͺ μ λλ€. κ° μΈμ€ν΄μ€κ° μμ±λλ κ³Όμ μμ μμΉ΄μ΄λΈ λμλ κ° κ°μ²΄λ€μ μΈμμΉ΄μ΄λΈκ° λλ©΄μ μμ±μλ₯Ό νΈμΆν©λλ€. μ΄λ NSCoding νλ‘ν μ½μ μ±ννκ³ μλ κ°μ²΄λ€μ λͺ¨λ initWithCoder λ©μλλ₯Ό νΈμΆνκ³ κ·Έ μΈμ κ°μ²΄λ€μ μμ μ μμ±μλ₯Ό νΈμΆν©λλ€. λͺ¨λ κ°μ²΄μ μΈμ€ν΄μ€κ° μμ±λλ©΄ nib-loading μ½λκ° κ°μ²΄λ€μ΄ κ°μ§κ³ μλ outletκ³Ό actionμ λ€μ μ°κ²°νλ μμ μ ν©λλ€. μ΄ μμ μ΄ μλ£λλ©΄ λ§μ§λ§μΌλ‘ awakeFromNib λ©μλλ₯Ό νΈμΆν©λλ€.
π‘ Typically, you implement awakeFromNib for objects that require additional set up that cannot be done at design time. For example, you might use this method to customize the default configuration of any controls to match user preferences or the values in other controls. You might also use it to restore individual controls to some previous state of your application.
awakeFromNibμ μΈμ€ν΄μ€κ° μμ±λλ μκ°μ νμ§ λͺ»νλ μΌλ€ ꡬνν΄λ μ μμ΅λλ€. Controlμ λν μ€μ μ μΆκ°νκ±°λ μ΄μ μνλ₯Ό 볡μνλ μ½λλ₯Ό μΆκ°ν μ μμ£ !
컀μ€ν μ λ§λ€κΈ°
κ·ΈλΌ μ΄μ 컀μ€ν μ μ λ§λ€μ΄μ λ°©κΈ μμ±νλ ν΄λμ€μ μ°κ²°ν΄μ£Όκ² μ΅λλ€. μ¬μ€ 컀μ€ν μ μ λ§λλ €λ©΄ XIBλ₯Ό λ§λλ κ²μ΄ λ§κ² μ§λ§ μ¬κΈ°μλ μλ΅νκ³ μ΄μ ν¬μ€νΈμμ μ¬μ©νλ μ¬μ¬μ© μ μ ν΄λμ€λ§ μ νμ£Όλλ‘ ν κ²μ.
λ¨Όμ μ§λ ν¬μ€νΈμμ λ§λ€μ΄λμλ μ¬μ¬μ© μ μ ν΄λμ€λ₯Ό μμ±ν 컀μ€ν ν΄λμ€λ₯Ό μΆκ°ν΄μ€λλ€.
μΈ μ’ λ₯μ λ μ΄λΈμ΄ νμνκ² μ£ ?
κ·Έλ¦¬κ³ μ΄ λ μ΄λΈλ€μ μ κ·Όν΄μ κ°μ μ§μ ν΄μ£Όμ΄μΌ νλ, Outlet λ³μλ₯Ό λ§λ€μ΄μΌν©λλ€.
μ΄λ κ² 3κ°μ UILabelμ λν Outlet λ³μλ₯Ό λ§λ€κ³ ,
μ€ν 리보λλ‘ μ΄λν΄μ μ΄λ κ² Outletκ³Ό λ§λ€μ΄λ λ μ΄λΈμ μ°κ²°ν©λλ€.
κ·ΈλΌ μ΄μ μ€λΉλ λ κ² κ°λ€μ. μ΄μ λ·° 컨νΈλ‘€λ¬λ‘ μ΄λν΄μ μ μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄ ν μ΄λΈ λ·°μκ² λ°νν΄μ£Όλ cellForRowAt λ©μλλ₯Ό ꡬνν΄λ³΄κ² μ΅λλ€.
μ μ λ°μ΄ν°λ₯Ό μ ν λ°ννκΈ°
μ΄μ ν¬μ€νΈμμ ꡬννλ λ©μλμμ μμ ν μ¬νλ€μ΄ μκ²Όμ΅λλ€! λ¨Όμ dequeueReusableCellμμ μ μ κΊΌλ΄μ λ°μ΄ν°λ₯Ό μ νμ£Όμ΄μΌ νλλ°μ,
μ΄ λ©μλλ μ°λ¦¬κ° λ§λ 컀μ€ν ν΄λμ€μ μμ ν΄λμ€μΈ UITableViewCell ν΄λμ€λ₯Ό λ°νν©λλ€. κ·Έλμ μ΄ μνλ‘λ μ°λ¦¬κ° λ§λ λ μ΄λΈλ€μ Outlet λ³μμ μ κ·Όν μκ° μμ£ . μ΄λ₯Ό μν΄μ λ°νλ°μ UITableViewCellμ 컀μ€ν ν΄λμ€λ‘ λ€μ΄μΊμ€ν μ ν΄μ£Όμ΄μΌν©λλ€.
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
.
.
.
μ΄λ κ²μ!
κ·ΈλΌ μ΄μ Outlet λ³μλ€μ μ κ·Όν μ μκ² μ£ ? μ§κΈλΆν°λ μ΄μ ν¬μ€νΈμμ ꡬννλ λ΄μ©μ μ‘°κΈλ§ λ³κ²½ν΄μ£Όλ©΄ λ©λλ€~!
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
cell.name.text = sections[indexPath.section][indexPath.row].name
cell.callType.text = sections[indexPath.section][indexPath.row].type
cell.day.text = sections[indexPath.section][indexPath.row].day
cell.accessoryType = .detailButton
return cell
}
μ¬μ¬μ© μ μΈμ€ν΄μ€κ° κ°μ§ Outlet λ³μμΈ λ μ΄λΈλ€μ νμ¬ μΈλ±μ€μ λ§λ λ°μ΄ν°λ€μ λΆλ¬μ λ£μ΄μ£Όκ³ κ·Έλλ‘ λ°ννλ©΄ λμ λλ€!
κ·ΈλΌ μ€νν΄λ³΄μ£ !
μ΄μ μ λ² μ°λ½μ² μ±μ ν μ΄λΈκ³Ό λΉμ·ν΄μ‘λ€μ~!
μ£Όλ§μ λͺ¨λ μΌλ ν μ΄λΈ λ·° μ 볡νκΈ° νλ‘μ νΈκ° λλ¬μ΅λλ€γ γ XIBλ₯Ό λ§λ€μ΄μ 컀μ€ν μ μ λ§λ€κ³ μ½λλ‘ λ£μ΄μ£Όλ κ²λ νκ³ μΆμλ° μ΄λ²μ£Ό μ€μΌλ‘ μ΄ ν¬μ€νΈμ μ λ°μ΄νΈ ν΄λ³΄λλ‘ νκ² μ΅λλ€. μ½μ΄μ£Όμ μ κ°μ¬ν©λλ€!!