๐จ UITableView ์ด์ ๋ชจ์
ํ
์ด๋ธ ๋ทฐ์์ ์ฌ์ํ๋ฉด์๋ ํํ ๋ฐ์ํ ์ ์๋ ์ด์๋ค์ ๋ชจ์๋ณด์์ต๋๋ค.
1. Optional error๊ฐ ๋ฐ์ํ๋ค๋ฉด?

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
- ์ต์
๋ ์๋ฌ๊ฐ ๋ฌ๋ค๋ฉด identifier ์คํ๊ฐ ๋ฌ๋์ง ํ์ธํด ๋ด
์๋ค.
- identifier ์คํ๋ก ํด๋น ์
์ ์ฐพ์ง ๋ชปํ๋๋ฐ, ์ต์
๋์ ๊ฐ์ ๋ก ๋ฒ๊ฒผ์ ๋ ๋๋ ์ด์์
๋๋ค.
extension UITableViewCell {
static var identifier: String {
String(describing: self)
}
}
- ์ด๋ฌํ ํด๋จผ์๋ฌ๋ฅผ ์ค์ด๊ธฐ ์ํด identifier๋ฅผ ์์ ํ์
์์ฑ์ผ๋ก ๋ง๋์๋๊ฑธ ์ถ์ฒ๋๋ฆฝ๋๋ค.
2. Cell์ด ์๋ณด์ธ๋ค๋ฉด?
let list = ["ํ๋ก์ ํธ", "์ผํ", "๋ฉ์ธ ์
๋ฌด", "๊ณผ์ "]
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
- ๋ฐฐ์ด์ ๋ด์ฉ์ ์ถ๊ฐํ๋๋ฐ ์๋ณด์ธ๋ค๋ฉด numberOfRowsInSection ๋ถ๋ถ์ ์ดํด๋ด
์๋ค.
- ๋ฐ์ดํฐ ๊ฐ์์ ์
์ ๊ฐ์๋ฅผ ๊ผญ ๋ง์ถฐ์ค์ผ ํฉ๋๋ค.
- ๋ฐ์ดํฐ ๊ฐ์ > ์
๊ฐ์ โ ์
๊ฐ์ ๋งํผ๋ง ๋์ต๋๋ค.
- ๋ฐ์ดํฐ ๊ฐ์ < ์
๊ฐ์ โ ์ธ๋ฑ์ค ์๋ฌ๊ฐ ๋ฉ๋๋ค.
3. Index out of range ์ธ๋ฑ์ค ์๋ฌ๊ฐ ๋๋ค๋ฉด?

let list = ["ํ๋ก์ ํธ", "์ผํ", "๋ฉ์ธ ์
๋ฌด"]
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 4
}
- ๋ง์ฐฌ๊ฐ์ง๋ก numberOfRowsInSection ๋ฉ์๋ ๋ถ๋ถ์ ํ์ธํด๋ด
์๋ค.
- ์
๊ฐ์ ๋งํผ ๋ฐ๋ณตํ๋๋ฐ ๋ฐฐ์ด ๊ฐ์๊ฐ ์ ๋ค? โ list[3]์ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก ์ธ๋ฑ์ค ์๋ฌ๊ฐ ๋ฉ๋๋ค.
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return list.count
}
- ๊ทธ๋์ ๋ณดํต
list.count ๋ก ์จ์ฃผ๋ ํธ์
๋๋ค.
- ๋ง์ฝ ํํฐ๋ง์ ํ๊ฑฐ๋ ๋ฐฐ์ด ๋ฒ์๋ฅผ ์ค์ฌ์ผ ํ๋ ๊ฒฝ์ฐ, ์กฐ๊ฑด ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์๊ฑฐ๋ ์๋ณธ ๋ฐฐ์ด์ ๊ฑด๋๋ฆฌ์ง ์๋ ๋ฐฉํฅ์ผ๋ก ํด์ฃผ์
์ผ ํฉ๋๋ค.
4. ํ
์ด๋ธ ๋ทฐ์ ๋ฐ์ดํฐ๊ฐ ๋ฐ์์ด ์๋๋ค๋ฉด?
tableView.reloadData()
- ์ด
reloadData()๋ฅผ ๋น ํธ๋ฆฐ๊ฑด ์๋์ง ํ์ธํด๋ด
์๋ค.
- ๋ทฐ์ ๋ฐ์ดํฐ๋ ๋ฐ๋ก ๋๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ค์ ๊ฐฑ์ ์์ผ์ค์ผ ํฉ๋๋ค.
- ํ
์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค ๊ฐฑ์ ์์ผ์ฃผ๋๊ฒ
reloadData()์
๋๋ค.
- ํ
์ด๋ธ ๋ทฐ์ ์ค์์ดํ ์ ๋๋ฉ์ด์
๊น์ง ์์ ๋ฒ๋ฆด ์ ์์ผ๋ ๊ทธ๋ด๋ ํ ์ค๋ง ๋ฆฌ๋ก๋ ํด์ฃผ๋
reloadRows๋ฅผ ์ฌ์ฉํด๋ด
์๋ค.
5. ํ
์ด๋ธ Cell์ ๋์ด๊ฐ ๋์ ์ผ๋ก ๋ณํ์ง ์๋๋ค๋ฉด?
Cell์ Label์ด ์๊ณ ์ด Label์ ํ
์คํธ ์์ด ์์ ๋กญ๊ฒ ์ค์ด๋ค๊ณ ๋์ด๋๋ค๋ฉด, Cell ๋์ด ์ญ์ ๋์ ์ผ๋ก ๋ณํด์ผ์ง Label์ด ์๋ฆฌ์ง ์์ ๊ฒ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ณํ์ง ์๋๋ค๋ฉด?
5-1. rowHeight๋ฅผ automaticDimension์ผ๋ก ์ค์
tableView.rowHeight = UITableView.automaticDimension
- ๋จผ์ ๋์ด๋ฅผ
UITableView.automaticDimension๋ก ์ค์ ํ์
์ผ ํฉ๋๋ค.
5-2. numberOfLines๋ฅผ 0์ผ๋ก ์ค์
cell.textLabel?.numberOfLines = 0
- Label์ numberOfLines๋ฅผ 0์ผ๋ก ์ค์ ํ์
จ๋์ง ํ์ธํด๋ด
์๋ค.
- numberOfLines๋ Label์ ์ค ์๋ฅผ ์ค์ ํ ์ ์๋ ์์ฑ์ธ๋ฐ, 0์ผ๋ก ํ๋ค๋๊ฑด ํ
์คํธ๋ฅผ ๋ฌดํ์ผ๋ก ๋ค ๋ณด์ฌ์ฃผ๊ฒ ๋ค๋ ์๋ฏธ์
๋๋ค.
- ์ด๊ฑธ ์ค์ ์ํ๋ฉด default๊ฐ 1์ด๋ 1์ค๋ง ๋ณด์ฌ์ฃผ๊ฒ ๋ฉ๋๋ค.
- 0์ผ๋ก ๋ฐ๊ฟ์ค์ผ ์ค ์ ๋งํผ ๋์ ์ผ๋ก ๋์ด๊ฐ ๋ฐ๋ ์ ์์ต๋๋ค.
5-3. Cell ์คํ ๋ ์ด์์ ์ค์
- ๋์ด๊ฐ ๋์ด๋๋ ๊ณณ์ height์ ๊ณ ์ ํ๋ฉด ์๋ฉ๋๋ค.
- ๊ทธ๊ณณ์ ์ ์ธํ๊ณ ๋๋จธ์ง๋ ์ฌ๋ฐฑ๊ณผ ๋์ด๋ฅผ ๊ณ ์ ์์ผ์ผํฉ๋๋ค.
- ํ
์คํธํ๋๋ ํฐํธ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํด์ ๋์ด ๊ณ ์ ์ํค๋๊ฒ ์ค๋ฅ๊ฐ ์ ์ ํธ์
๋๋ค.
5-4. ์ต์ ๋์ด ์ค์
- ๋ง์ฝ ์ต์ ๋์ด๋ ๊ณ ์ ์์ผ์ผ ํ๋ค๋ฉด ์คํ ๋ ์ด์์ ๋์ด ์ค์ ํธ์งํ๋ ๋ถ๋ถ์์ ๋ถ๋ฑํธ๋ก >= ์ด์์ผ๋ก ์ค์ ํด์ค์๋ค.
6. ๋ฐ์ดํฐ ์ญ์ ๊ฐ ์๋๋ค?
- ํน์ ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ์ง ์๊ณ
deleteRows ๋ฉ์๋๋ง ์ฌ์ฉํ์
จ๋์? ์ด ๋ฉ์๋๋ ๋จ์ํ ๋ทฐ๋ฅผ ๋ณ๊ฒฝํด์ค ๋ฟ, ์ค์ ๋ฐ์ดํฐ์๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
- ์ค์ ๋ฐ์ดํฐ๋ฅผ removeํด์ฃผ์๊ณ
deleteRows๋ฅผ ์ฌ์ฉํด๋ด
์๋ค.
6-1. ๋ฐ์ดํฐ๋ ์ง์ฐ๊ณ deleteRowsํ๋๋ ์๋ฌ๋๊ณ ์ด์ํด์
- ์
๋ฐ์ดํฐ๋ฅผ ์ง์ ์ง๋ง ๋ค๋ฅธ ์ ๋ณด(๋ฒํผ์ tag ๋ฑ)๋ ๊ทธ๋๋ก๋ผ์ ๊ทธ๋ด ์ ์์ต๋๋ค.
reloadData, reloadRows, reloadSections์ ์ฌ์ฉํด์ ์ ๋ณด๋ค์ ์
๋ฐ์ดํธํด์ฃผ์ธ์.
7. ๊ทธ๋ฅ ์
์ด ์ด์ํ๊ฒ ๋์์(?)
| ์๋ํ ๊ฒ | ์ค์ ๋ก ๋์จ ๊ฒ |
|---|
 |  |
์
์ด 1000๊ฐ ์๋ค๊ณ ์ง์ง๋ก ์
1000๊ฐ๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ณ , ์์ฐ์ค๋ฌ์ด ์คํฌ๋กค์ ์ํด์ TableView, CollectionView์ ๋์
๋ ๊ฐ๋
์ด ์ฌ์ฌ์ฉ ๋ฉ์ปค๋์ฆ์
๋๋ค.
- ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๋ง๋ฅ 1000๊ฐ ์ค 10๊ฐ ์ ๋๋ง ๋ง๋ค์ด์ ๋๋ ค์ฐ๋ ๊ฒ์ธ๋ฐ์, ์ด ๊ณผ์ ์์ ์ด์ ์ ๋ฐ์ดํฐ๊ฐ ๋จ์์์ ์ ์์ต๋๋ค.
- ๊ทธ๋์ ์ ์ด์ ์
์ ๋ง๋๋ cellForRowAt ๋ถ๋ถ์์ ์กฐ๊ฑด ์ฒ๋ฆฌ๋ฅผ 100% ํด์ฃผ์
์ผ ํฉ๋๋ค.