TableView Row(ν) λμ΄
μΌκ΄μ μΈ ν λμ΄λ₯Ό μ‘°μ νλ κ²μ΄λΌλ©΄, μ μμ μ½λλ₯Ό μ¬μ©νλ κ²μ΄ λ λμ보μΈλ€.
self.tableView.rowHeight = 80
// μ
μ λμ΄(μ΅μ
, λΉλ λμ) (feat. tableView.rowHeight)
// λ©μλμ μ°μ μμκ° λ λλ€.
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
μΌνμ°μ°μμ μ¬μ©
μΌνμ°μ°μλ₯Ό μ²μ μκ² λμμ λ, μ λ§ λͺ¨λ λΆλΆμ μ½λλ₯Ό λ¨μ©νμλ€. κ·Έλ°λ° μ¬μ©νλ€λ³΄λ μ€νλ € μ½λλ₯Ό μ΄ν΄νλ λ° μκ°μ΄ 걸리λ κ²½μ°λ λ§μκ³ , μ¬λ¬ μ‘°κ±΄μ΄ κ²Ήμ³ μλ κ²½μ°μλ μ¬μ©νκΈ° μ΄λ €μ λ€. κ·Έλ κΈ°μ μ μ ν μκ°μ μ¬μ©νλ κ²μ΄ νμνλ€κ³ μκ°μ΄ λ€μλ€. μΌνμ°μ°μμ μ¬μ©μ μ€νλ € μ§μνλ κ²μ΄ μ’μ보μκ³ , μ λ§ κ°λ¨ν λΆλΆμλ§ μ¬μ©νλ κ²μ΄ μ’μ보μΈλ€.
if indexPath.row % 2 == 0 {
cell.imageView?.image = UIImage(systemName: "star")
cell.backgroundColor = .white
} else {
cell.imageView?.image = UIImage(systemName: "star.fill")
cell.backgroundColor = .systemGray6
}
cell.imageView?.image = indexPath.row % 2 == 0 ? UIImage(systemName: "star") : UIImage(systemName: "star.fill")
cell.backgroundColor = indexPath.row % 2 == 0 ? .white : .systemGray6
μ μ 2κ° μ΄μ μ¬μ©νλ€λ©΄?
νλμ ν μ΄λΈ λ·°μμ μ¬λ¬ κ°μ μ μ μ¬μ©νκ³ μΆμ κ²½μ°κ° μλ€. μ΄λ° κ²½μ° μμ€ν μ΄ μ μ ν μ μ κΊΌλ΄μ ν μ΄λΈλ·°μ λΏλ €μ€ μ μμ΄μΌ νλλ° κ·Έκ²μ κ°λ₯νκ² νλλ‘ identifierκ° μ¬μ©λλ€. μ μ μ΄λ¦νλΌκ³ μκ°νλ©΄ νΈν κ² κ°λ€.
μ¬μ¬μ© λ©μ»€λμ¦
1000κ°μ μ μ νλ©΄μ 보μ¬μ€ κ²μ΄λΌκ³ ν΄μ μ μ ν λ²μ λ€ λ§λ€μ΄λλ κ²μ μλλ€. νλ©΄μλ λΉμ₯ νμν μ λ§ λ³΄μ¬μ£Όκ³ λ§λ€μ΄ λμ μ μ μ¬μ¬μ©νλ κ΅¬μ‘°λ‘ μ΄λ£¨μ΄μ§λ€. λ₯ν λ©μ»€λμ¦μ μ΄νμ μμ보λλ‘ νμ.
Enumμ νμ©ν μ½λ κ°μ
μ°μΈ‘ νλ©΄μ μ΄λ»κ² ꡬμ±ν μ μμκΉ? κ°λ¨νκ² TableViewControllerλ₯Ό μ΄μ©ν΄λ³΄λλ‘ νμ.
CaseIterable
μ΄κ±°νμ λ°°μ΄μ²λΌ μ¬μ©ν μ μλλ‘ λμμ£Όλ νλ‘ν μ½
CustomStringConvertible
μλ λ§ν¬ μ°Έκ³
[Swift] CustomStringConvertible
νκ°μ§ μλ‘ μκ²λ κ²μ CustomStringConvertible νλ‘ν μ½μ μ±ννκ³ , μΆλ ₯μ νλ©΄ descriptionμΌλ‘ μ ν΄ λμ String κ°μΌλ‘ μΆλ ₯λκΈΈλ κ·Έ λμ Type μμ StringμΈ μ€ μμμ§λ§ Typeμ κ·Έλλ‘ μ΄κ±°ν νμ μ΄μλ€. print(SettingType.total)μ κ°μ΄ μΆλ ₯μ νλ©΄ "μ 체 μ€μ "κ³Ό κ°μ΄ μΆλ ₯λλλ° μ΄λ₯Ό ν€λμ νμ΄λ₯Όλ‘ μ¬μ©ν μ μμλ μ΄μ λ String νμ μ΄ μλλΌ μ΄κ±°ν νμ μ΄μκΈ° λλ¬Έμ΄λ€. κ·Έλμ StringμΌλ‘ λ³νν΄μ£Όμ΄μ μ½λλ₯Ό μμ±νμλ€.
// λ€μκ³Ό κ°μ μΈμ€ν΄μ€ λ©μλλ μλλΌ.
String(describing: <#T##CustomStringConvertible#>)
λμ κ²½μ° μλμ κ°μ΄ μ½λλ₯Ό μμ±ν΄μ μμ νλ©΄μ ꡬννλ€.
import UIKit
enum SettingType: CaseIterable, CustomStringConvertible {
case total
case personal
case etc
var contents: [String] {
switch self {
case .total:
return ["곡μ§μ¬ν", "μ€νμ€", "λ²μ μ 보"]
case .personal:
return ["κ°μΈ/보μ", "μλ¦Ό", "μ±ν
", "λ©ν°νλ‘ν"]
case .etc:
return ["κ³ κ°μΌν°/λμλ§"]
}
}
var numberOfRowInSections: Int {
return contents.count
}
var description: String {
switch self {
case .total:
return "μ 체 μ€μ "
case .personal:
return "κ°μΈ μ€μ "
case .etc:
return "κΈ°ν"
}
}
}
final class SettingViewController: UITableViewController {
override func numberOfSections(in tableView: UITableView) -> Int {
return SettingType.allCases.count
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return String(describing: SettingType.allCases[section])
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return SettingType.allCases[section].numberOfRowInSections
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "settingCell") else { return UITableViewCell() }
cell.textLabel?.text = SettingType.allCases[indexPath.section].contents[indexPath.row]
return cell
}
}
λ€λΉκ²μ΄μ 컨νΈλ‘€λ¬ μ§μ μμΉ
- ν λ° + λ€λΉκ²μ΄μ
- λ€λΉκ²μ΄μ + κ° Child λ·° 컨νΈλ‘€λ¬
- 1λ²μ κ²½μ°, κ° λ·° 컨νΈλ‘€λ¬μ ν λ° μμ΄ν μ μ€μ νκΈ°κ° νΈνλ€.
- 2λ²μ κ²½μ°, λ€λΉκ²μ΄μ λ° κ΅¬νμ΄ νΈνλ€. λ€λΉκ²μ΄μ λ° νμ΄ν, μμ΄ν μ μ€μ νκΈ°κ° νΈνλ€.
Extension
- νμν μμλ€λ§ μ΅μ€ν μ μΌλ‘ λ§λ€μ.
- ν κ΅°λ°μμλ§ μ¬μ©νλ€λ©΄ μ΅μ€ν μ μΌλ‘ λ§λ€μ§ μλ κ²μ΄ μ’λ€.
- UIViewController+Extension μμ 100κ°μ ν¨μλ₯Ό μΆκ°λ‘ μ μΈν΄λμλ€κ³ κ°μ ν΄λ³΄μ. UIViewControllerλ₯Ό μμν΄μ€κ±°λ μ¬μ©νλ €κ³ ν λ κ·Έ ν¨μλ€κΉμ§ λΆλ¬μ€κΈ° λλ¬Έμ λΆνμν νΈμΆμ΄ μΌμ΄λ μ μκ³ λ¬΄κ±°μμ§λ€.
Store Property
- μ μ₯ νλ‘νΌν°λ ν¬ν¨ν μ μλ€.
- μ μΈνλ μμ μ λ©λͺ¨λ¦¬μ μ¬λΌκ°κΈ° λλ¬Έμ νμ₯μ ννλ‘ μ¬μ©ν μ μλ€.
- cf) λ©μλλ νΈμΆνλ μμ μ μ¬μ©λκΈ° λλ¬Έμ νμ₯μ ν μ μλ κ²μ΄λ€.
Issue
- TableView ViewController μ°κ²° μ΄μ (Xcode λκ³ μΌκΈ°, Clean Build Folder, μμΌλ‘ μ°κ²°νκΈ°)
- Identifier ν΄λ¨Ό μλ¬ (Cell Idλ μ νν μ°μ)
- numberOfRowInSection (λ©μλ μ νν μ¬μ©νμ)
컀μ€ν μ μμ±νκΈ°
- μ ν΄λμ€ νμΌ μμ±
- μ κ³Ό ν΄λμ€ μ°κ²° (μ νν 맀μΉμμΌμ£Όμ΄μΌ ν¨)
- μ identifier μ€μ
- μ κΊΌλ΄κΈ°
μ μΆκ°νκΈ°(κ°±μ νκΈ°)
ReloadData
λ°°μ΄μ λ°μ΄ν°λ₯Ό μ μΆκ°ν΄μ€λ€κ³ ν΄λ, ν μ΄λΈλ·°μλ λ³κ²½ μ¬νμ΄ λ°μλμ§ μλλ€. κ·Έλ κΈ° λλ¬Έμ UIλ₯Ό λ€μ 그리λΌκ³ TableViewμ μμ²ν νμκ° μλ€. λ°μ΄ν°κ° λ¬λΌμ§λ μμ μ μ μ ν μμ²λμ΄μΌ νλ€. λ€μκ³Ό κ°μ λ©μλλ₯Ό νΈμΆν΄μ ν μ΄λΈλ·°λ₯Ό λ€μ 그리λλ‘ νλ€.
tableView.reloadData()
reloadData()μμ μλ λ€μ μμ μ΄ μ€νλλ€.
- numberOfItemsInSection λ©μλ : cellμ κ°μ κ²°μ
- cellForItemAt λ©μλ : νλ©΄μ 보μ¬μ§ λ§νΌμ μ μμ±
λ§€λ² μ 체λ₯Ό κ°±μ ν΄μΌ ν κΉ?
Section, Rowλ§ κ°±μ ν μλ μλ€. μ μ ν μ νν΄μ μ¬μ©νλλ‘ νμ.
- reloadSections()
- reloadRows()
μμ μ½λ
import UIKit
class BucketlistTableViewController: UITableViewController {
var list = ["λ²μ£λμ", "ν건", "ν λ₯΄"]
@IBOutlet weak var userTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.rowHeight = 90
}
@IBAction func userTextFieldDidFinish(_ sender: UITextField) {
self.list.append(sender.text!)
self.tableView.reloadData()
}
}
// MARK: - Methods
extension BucketlistTableViewController {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.list.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: BucketlistTableViewCell.self), for: indexPath) as! BucketlistTableViewCell
cell.bucketlistLabel.text = self.list[indexPath.row]
cell.bucketlistLabel.font = .boldSystemFont(ofSize: 18)
return cell
}
}
ν μ΄λΈλ·° κ΄λ ¨ λ©μλ λ° κΈ°λ₯
μ€ν¬λ‘€ μ ν€λ³΄λ dismiss
Reload
self.tableView.reloadData()
self.tableView.reloadSections(IndexSet(0...0), with: .fade)
self.tableView.reloadRows(at: [IndexPath(row: 0, section: 0), IndexPath(row: 1, section: 0)], with: .fade)
Move & Swipe
override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
// μ
μ΄λ
}
override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
// μμ
}
override func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
// μ¦κ²¨μ°ΎκΈ° ν κ³ μ
}
Default Edit(+Delete)
// νΈμ§ κ°λ₯ν μνλ‘ λ§λ€ μ μμ
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
// λ°°μ΄ μμ νμ ν
μ΄λΈ λ·° κ°±μ
list.remove(at: indexPath.row)
tableView.reloadSections(IndexSet(0...0), with: .automatic)
}
}
'π± SeSAC' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[SeSAC] 220721 TIL (0) | 2022.07.21 |
---|---|
[SeSAC] 220720 TIL (0) | 2022.07.21 |
[SeSAC] 220718 TIL (0) | 2022.07.21 |
[SeSAC] 220715 TIL (0) | 2022.07.21 |
[SeSAC] 220714 TIL (0) | 2022.07.21 |