Table views 🍎

YaR LabΒ·2023λ…„ 6μ›” 25일
0

iOS 🍎

λͺ©λ‘ 보기
2/26
post-thumbnail

1️⃣ μ •μ˜

μ‚¬μš©μž μ •μ˜ κ°€λŠ₯ν•œ ν–‰μœΌλ‘œ κ΅¬μ„±λœ 단일 열에 데이터λ₯Ό ν‘œμ‹œ

2️⃣ μ„€λͺ…

  • ν…Œμ΄λΈ” λ·°λŠ” μ„Έλ‘œλ‘œ μŠ€ν¬λ‘€λ˜λŠ” λ‚΄μš©μ„ 단일 μ—΄λ‘œ ν‘œμ‹œν•˜λ©°, ν–‰κ³Ό μ„Ήμ…˜μœΌλ‘œ λ‚˜λ‰˜μ–΄ 있음
  • 각 행은 μ•±κ³Ό κ΄€λ ¨λœ 단일 정보λ₯Ό ν‘œμ‹œν•˜κ³ , μ„Ήμ…˜μ„ μ‚¬μš©ν•˜μ—¬ κ΄€λ ¨λœ 행을 κ·Έλ£Ήν™”ν•  수 있음

3️⃣ ꡬ성

ν…Œμ΄λΈ” λ·°λŠ” λ‹€μ–‘ν•œ 객체듀 κ°„μ˜ ν˜‘λ ₯으둜 ꡬ성됨

  • μ…€ (Cells) : 셀은 μ»¨ν…μΈ μ˜ μ‹œκ°μ μΈ ν‘œν˜„μ„ μ œκ³΅ν•˜κ³ , UIKitμ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ 셀을 μ‚¬μš©ν•˜κ±°λ‚˜ μ•±μ˜ μš”κ΅¬μ— 맞게 μ‚¬μš©μž μ •μ˜ 셀을 μ •μ˜ν•  수 있음
  • ν…Œμ΄λΈ” λ·° 컨트둀러 (Table view controller) : 일반적으둜 UITableViewController 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ ν…Œμ΄λΈ” λ·°λ₯Ό 관리함. λ‹€λ₯Έ λ·° μ»¨νŠΈλ‘€λŸ¬λ„ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, 일뢀 ν…Œμ΄λΈ” κ΄€λ ¨ κΈ°λŠ₯을 μ‚¬μš©ν•˜λ €λ©΄ ν…Œμ΄λΈ” λ·° μ»¨νŠΈλ‘€λŸ¬κ°€ ν•„μš”ν•¨
  • 데이터 μ†ŒμŠ€ 객체 (Data source object) : 이 κ°μ²΄λŠ” UITableViewDataSource ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜κ³  ν…Œμ΄λΈ”μ— λŒ€ν•œ 데이터λ₯Ό 제곡
  • 델리게이트 객체 (Delegate object) : 이 κ°μ²΄λŠ” UITableViewDelegate ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜κ³  μ‚¬μš©μžμ˜ ν…Œμ΄λΈ” λ‚΄μš©κ³Όμ˜ μƒν˜Έμž‘μš©μ„ 관리

4️⃣ ν…Œμ΄λΈ”μ— 데이터 μ±„μš°κΈ°

  • ν…Œμ΄λΈ”μ˜ 셀을 λ™μ μœΌλ‘œ 데이터 μ†ŒμŠ€ 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±ν•˜κ³  κ΅¬μ„±ν•˜κ±°λ‚˜, μŠ€ν† λ¦¬λ³΄λ“œμ—μ„œ μ •μ μœΌλ‘œ μ œκ³΅ν•  수 있음
  • ν…Œμ΄λΈ” λ·°λŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ 데이터 기반data-driven μš”μ†Œ
  • 데이터 μ†ŒμŠ€ 객체(UITableViewDataSource ν”„λ‘œν† μ½œμ„ μ±„νƒν•œ 객체)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•±μ˜ 데이터 및 각 데이터λ₯Ό 화면에 λ Œλ”λ§ν•˜λŠ” 데 ν•„μš”ν•œ λ·°λ₯Ό μ œκ³΅ν•¨
  • ν…Œμ΄λΈ” λ·°λŠ” λ·°λ₯Ό 화면에 λ°°μΉ˜ν•˜κ³  데이터 μ†ŒμŠ€ 객체와 ν•¨κ»˜ μž‘λ™ν•˜μ—¬ 데이터λ₯Ό μ΅œμ‹  μƒνƒœλ‘œ μœ μ§€ν•¨
  • ν…Œμ΄λΈ” λ·°λŠ” 데이터λ₯Ό ν–‰rowκ³Ό μ„Ήμ…˜section으둜 κ΅¬μ„±ν•˜μ—¬ 정리함
  • 행은 κ°œλ³„ 데이터 ν•­λͺ©μ„ ν‘œμ‹œν•˜κ³ , μ„Ήμ…˜μ€ κ΄€λ ¨λœ 행을 ν•¨κ»˜ 그룹화함
  • μ„Ήμ…˜μ€ ν•„μˆ˜λŠ” μ•„λ‹ˆμ§€λ§Œ 이미 계측적인 데이터λ₯Ό κ΅¬μ„±ν•˜λŠ” 쒋은 방법

5️⃣ ν–‰(row)κ³Ό μ„Ήμ…˜(section)의 개수λ₯Ό μ œκ³΅ν•˜λŠ” λ©”μ„œλ“œ

ν…Œμ΄λΈ” λ·°κ°€ 화면에 λ‚˜νƒ€λ‚˜κΈ° 전에, ν…Œμ΄λΈ” λ·°λŠ” 총 ν–‰(row)κ³Ό μ„Ήμ…˜(section)의 개수λ₯Ό μ§€μ •ν•˜λ„λ‘ μš”μ²­ν•¨

func numberOfSections(in tableView: UITableView) -> Int  // Optional 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
  • λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•  λ•ŒλŠ” κ°€λŠ₯ν•œ λΉ λ₯΄κ²Œ ν–‰(row)κ³Ό μ„Ήμ…˜(section)의 개수λ₯Ό λ°˜ν™˜ν•΄μ•Ό 함
  • ν–‰κ³Ό μ„Ήμ…˜ 정보λ₯Ό μ‰½κ²Œ κ°€μ Έμ˜¬ 수 μžˆλ„λ‘ 데이터λ₯Ό ꡬ쑰화해야 ν•  μˆ˜λ„ 있음
  • 데이터λ₯Ό κ΅¬μ‘°ν™”ν•˜μ—¬ ν–‰κ³Ό μ„Ήμ…˜μ˜ 정보λ₯Ό μ‰½κ²Œ κ°€μ Έμ˜¬ 수 μžˆλ‹€λ©΄, ν…Œμ΄λΈ” 뷰의 관리와 μ‚¬μš©μž κ²½ν—˜μ„ κ°œμ„ ν•  수 있음
  • 예λ₯Ό λ“€μ–΄, ν…Œμ΄λΈ”μ˜ 데이터λ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ 배열을 μ‚¬μš©ν•˜λŠ” 것을 κ³ λ €ν•΄ λ³Ό 수 있음
var hierarchicalData = [[String]]() 
 
override func numberOfSections(in tableView: UITableView) -> Int {
   return hierarchicalData.count // μ„Ήμ…˜μ˜ 갯수
}
   
override func tableView(_ tableView: UITableView, 
                        numberOfRowsInSection section: Int) -> Int {
   return hierarchicalData[section].count // μ„Ήμ…˜μ•ˆμ˜ ν–‰μ˜ 갯수
}

6️⃣ ν–‰(row)의 λͺ¨μ–‘ μ •μ˜

  • 셀을 μ‚¬μš©ν•˜μ—¬ μŠ€ν† λ¦¬λ³΄λ“œ νŒŒμΌμ—μ„œ ν…Œμ΄λΈ”μ˜ ν–‰row의 λͺ¨μ–‘을 μ •μ˜ν•¨
  • 셀은 ν…Œμ΄λΈ”μ˜ 행을 μœ„ν•œ ν…œν”Œλ¦Ώ 역할을 ν•˜λŠ” UITableViewCell객체
  • 셀은 뷰이며, 컨텐츠λ₯Ό ν‘œμ‹œν•˜λŠ” 데 ν•„μš”ν•œ λͺ¨λ“  ν•˜μœ„ λ·°λ₯Ό 포함할 수 있음
  • 라벨, 이미지 λ·° 및 λ‹€λ₯Έ λ·°λ₯Ό 컨텐츠 μ˜μ—­μ— μΆ”κ°€ν•˜κ³ , μ œμ•½ 쑰건을 μ‚¬μš©ν•˜μ—¬ μ΄λŸ¬ν•œ λ·°λ₯Ό μ •λ ¬ν•  수 있음
  • μ•±μ˜ μΈν„°νŽ˜μ΄μŠ€μ— ν…Œμ΄λΈ” λ·°λ₯Ό μΆ”κ°€ν•˜λ©΄ ꡬ성할 수 μžˆλŠ” ν•˜λ‚˜μ˜ ν”„λ‘œν† νƒ€μž… μ…€(ν…œν”Œλ¦Ώ)이 포함됨
  • 좔가적인 ν”„λ‘œν† νƒ€μž… 셀을 μΆ”κ°€ν•˜λ €λ©΄ ν…Œμ΄λΈ” λ·°λ₯Ό μ„ νƒν•˜κ³  Prototype Cells속성을 μ—…λ°μ΄νŠΈ 해야함
  • 각 셀은 μŠ€νƒ€μΌμ„ 가지며, μ΄λŠ” μ…€μ˜ λͺ¨μ–‘을 μ •μ˜ν•¨
  • UIKitμ—μ„œ μ œκ³΅ν•˜λŠ” ν‘œμ€€ μŠ€νƒ€μΌ 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν•˜κ±°λ‚˜, μ‚¬μš©μž μ •μ˜ν•œ μ»€μŠ€ν…€ μŠ€νƒ€μΌμ„ μ •μ˜ν•  수 있음

    μ…€ μŠ€νƒ€μΌμ„ μ‚¬μš©μž μ •μ˜λ‘œ μ„€μ •ν•˜κ±°λ‚˜ ν‘œμ€€ μ…€ μŠ€νƒ€μΌ 쀑 ν•˜λ‚˜λ‘œ μ„€μ • κ°€λŠ₯

    • μ…€μ˜ Identifier속성에 λΉ„μ–΄ μžˆμ§€ μ•Šμ€ λ¬Έμžμ—΄μ„ ν• λ‹Ή
    • μ‚¬μš©μž μ •μ˜ μ…€μ˜ 경우, 셀에 뷰와 μ œμ•½ 쑰건을 μΆ”κ°€
    • 아이덴티티 μΈμŠ€νŽ™ν„°μ—μ„œ μ‚¬μš©μž μ •μ˜ μ…€μ˜ 클래슀λ₯Ό 지정
  • μ‚¬μš©μž μ •μ˜ λ·°λ₯Ό ν¬ν•¨ν•˜λŠ” 셀을 생성할 λ•Œ, UITableViewCell의 μ„œλΈŒν΄λž˜μŠ€λ₯Ό μ •μ˜ν•˜μ—¬ ν•΄λ‹Ή λ·°λ₯Ό 관리함
  • μ„œλΈŒν΄λž˜μŠ€μ—μ„œ μ•±μ˜ 데이터λ₯Ό ν‘œμ‹œν•˜λŠ” μ‚¬μš©μž μ •μ˜ 뷰에 λŒ€ν•œ 아웃렛을 μΆ”κ°€ν•˜κ³ , μ΄λŸ¬ν•œ 아웃렛을 μ‹€μ œλ‘œ μŠ€ν† λ¦¬λ³΄λ“œ 파일의 뷰와 μ—°κ²°

    μ•„μšΈλ ›

    • μ•„μšΈλ ›μ€ iOS κ°œλ°œμ—μ„œ μΈν„°νŽ˜μ΄μŠ€ λΉŒλ”Interface Builder와 μ½”λ“œλ₯Ό μ—°κ²°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 속성
  • μ΄λŸ¬ν•œ 아웃렛은 λŸ°νƒ€μž„μ— 셀을 κ΅¬μ„±ν•˜λŠ” 데 ν•„μš”

7️⃣ ν–‰(row)에 λŒ€ν•΄ 셀을 μƒμ„±ν•˜κ³  ꡬ성

  • ν…Œμ΄λΈ” λ·°κ°€ 화면에 λ‚˜νƒ€λ‚˜κΈ° 전에, ν…Œμ΄λΈ” λ·°λŠ” λ³΄μ΄κ±°λ‚˜ κ°€κΉŒμš΄ μœ„μΉ˜μ— μžˆλŠ” 행듀을 μœ„ν•΄ 데이터 μ†ŒμŠ€ κ°μ²΄μ—κ²Œ 셀을 μ œκ³΅ν•˜λ„λ‘ μš”μ²­
  • 데이터 μ†ŒμŠ€ 객체의 tableView(_:cellForRowAt:) λ©”μ„œλ“œλŠ” λΉ λ₯΄κ²Œ 응닡해야 함

    tableView(_:cellForRowAt:) λ©”μ„œλ“œλ₯Ό λ‹€μŒκ³Ό 같은 νŒ¨ν„΄μœΌλ‘œ κ΅¬ν˜„

    • ν…Œμ΄λΈ” 뷰의 dequeueReusableCell(withIdentifier:for:)λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ…€ 객체λ₯Ό κ°€μ Έμ˜΄
    • μ…€μ˜ λ·°λ₯Ό μ‚¬μš©μžμ˜ μ•± λ°μ΄ν„°λ‘œ ꡬ성
    • 셀을 ν…Œμ΄λΈ” 뷰에 λ°˜ν™˜
  • κΈ°λ³Έ μ…€ μŠ€νƒ€μΌμ˜ 경우, UITableViewCellμ—λŠ” ꡬ성해야 ν•  λ·°κ°€ ν¬ν•¨λœ 속성이 있음
  • μ‚¬μš©μž μ •μ˜ μ…€μ˜ 경우, λ””μžμΈ μ‹œκ°„μ— 셀에 λ·°λ₯Ό μΆ”κ°€ν•˜κ³  ν•΄λ‹Ή 뷰에 μ•‘μ„ΈμŠ€ν•˜κΈ° μœ„ν•œ μ•„μšΈλ ›μ„ μΆ”κ°€
  • ν…Œμ΄λΈ” λ·°λŠ” ν…Œμ΄λΈ”μ˜ 각 행에 λŒ€ν•΄ 셀을 μƒμ„±ν•˜λ„λ‘ μš”μ²­ν•˜μ§€ μ•ŠλŠ” λŒ€μ‹ , ν…Œμ΄λΈ” λ·°λŠ” ν•„μš”ν•œ 셀을 μ§€μ—°ν•΄μ„œ μš”μ²­ν•˜λ©° ν…Œμ΄λΈ”μ˜ κ°€μ‹œ μ˜μ—­μ— μžˆλŠ” 셀에 λŒ€ν•΄μ„œλ§Œ μš”μ²­ν•©
  • μ§€μ—°ν•΄μ„œ 셀을 μƒμ„±ν•¨μœΌλ‘œμ¨ ν…Œμ΄λΈ”μ΄ μ‚¬μš©ν•˜λŠ” λ©”λͺ¨λ¦¬ 양을 쀄일 수 μžˆλŠ” λŒ€μ‹ , 데이터 μ†ŒμŠ€ 객체가 셀을 λΉ λ₯΄κ²Œ 생성해야 ν•œλ‹€λŠ” 것을 의미
  • tableView(_:cellForRowAt:) λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν…Œμ΄λΈ”μ˜ 데이터λ₯Ό λ‘œλ“œν•˜κ±°λ‚˜ μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©΄ μ•ˆλ¨βŒ

πŸ“Œ dequeueReusableCell(withIdentifier:for:)

μ§€μ •λœ μž¬μ‚¬μš© μ‹λ³„μžμ— λŒ€ν•œ μž¬μ‚¬μš© κ°€λŠ₯ν•œ ν…Œμ΄λΈ” λ·° μ…€ 객체λ₯Ό λ°˜ν™˜ν•˜κ³ , ν•΄λ‹Ή 셀을 ν…Œμ΄λΈ”μ— μΆ”κ°€ν•˜λŠ” λ©”μ„œλ“œ

func dequeueReusableCell(
    withIdentifier identifier: String,
    for indexPath: IndexPath
) -> UITableViewCell
  • Parameters
    • identifier : μž¬μ‚¬μš©ν•  μ…€ 객체λ₯Ό μ‹λ³„ν•˜λŠ” λ¬Έμžμ—΄μ΄κ³ , 이 λ§€κ°œλ³€μˆ˜λŠ” nil이 μ•„λ‹ˆμ–΄μ•Ό 함
    • indexPath : μ…€μ˜ μœ„μΉ˜λ₯Ό μ§€μ •ν•˜λŠ” 인덱슀 경둜. 항상 데이터 μ†ŒμŠ€ κ°μ²΄μ—μ„œ μ œκ³΅ν•˜λŠ” 인덱슀 경둜λ₯Ό 지정해야함. dequeueReusableCellλ©”μ„œλ“œλŠ” ν…Œμ΄λΈ” λ·°μ—μ„œμ˜ μ…€ μœ„μΉ˜μ— 따라 μΆ”κ°€ ꡬ성을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ 인덱슀 경둜λ₯Ό μ‚¬μš©ν•¨
  • Return Value
    • UITableViewCell : μ§€μ •λœ μž¬μ‚¬μš© μ‹λ³„μžμ™€ μ—°κ΄€λœ 객체, dequeueReusableCellλ©”μ„œλ“œλŠ” 항상 μœ νš¨ν•œ 셀을 λ°˜ν™˜
  • μ§€μ •λœ νƒ€μž…μ˜ κΈ°μ‘΄ 셀이 μžˆλŠ” 경우 ν•΄λ‹Ή 셀을 λ°˜ν™˜ν•˜κ±°λ‚˜, 이전에 μ œκ³΅ν•œ 클래슀 λ˜λŠ” μŠ€ν† λ¦¬λ³΄λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ 셀을 μƒμ„±ν•˜κ³  λ°˜ν™˜
  • ν…Œμ΄λΈ” 뷰의 데이터 μ†ŒμŠ€ 객체의 tableView(:cellForRowAt:)λ©”μ„œλ“œμ—μ„œλ§Œ 호좜 해야함
  • 데이터 μ†ŒμŠ€μ˜ tableView(:cellForRowAt:) λ©”μ„œλ“œ μ΄μ™Έμ—λŠ” 이 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μ•ˆλ¨βŒ
  • λ‹€λ₯Έ μ‹œμ μ—μ„œ 셀을 생성해야 ν•  κ²½μš°μ—λŠ” dequeueReusableCell(withIdentifier:)λ₯Ό μ‚¬μš© 해야함
  • register(:forCellReuseIdentifier:) λ˜λŠ” register(:forCellReuseIdentifier:) λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀 λ˜λŠ” nib νŒŒμΌμ„ 등둝할 μˆ˜λ„ 있고, dequeueReusableCellλ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 등둝 μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Ό 함

πŸ“Œ IndexPath

μ€‘μ²©λœ λ°°μ—΄ νŠΈλ¦¬μ—μ„œ νŠΉμ • μœ„μΉ˜λ‘œ μ΄λ™ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 인덱슀 λͺ©λ‘

μ€‘μ²©λœ λ°°μ—΄ 트리

  • λ°°μ—΄ μ•ˆμ— λ‹€μ‹œ 배열이 μ€‘μ²©λ˜μ–΄ μžˆλŠ” 데이터 ꡬ쑰λ₯Ό 의미
struct IndexPath
  • 인덱슀 경둜의 각 μΈλ±μŠ€λŠ” 트리 κ΅¬μ‘°μ—μ„œ ν•œ λ…Έλ“œμ—μ„œ λ‹€λ₯Έ, 더 κΉŠμ€ λ…Έλ“œλ‘œ μ΄λ™ν•˜κΈ° μœ„ν•œ μžμ‹ λ°°μ—΄ λ‚΄μ˜ 인덱슀λ₯Ό λ‚˜νƒ€λƒ„

Property

  • row : 인덱슀 경둜의 row κ°’
  • section : 인덱슀 경둜의 section κ°’

μΆœμ²˜πŸ“š

🍎Apple Docs: Table views
🍎Apple Docs: Filling a table with data
🍎Apple Docs: dequeueReusableCell(withIdentifier:for:)
🍎Apple Docs: IndexPath

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보