ํฐ์คํ ๋ฆฌ ๋ทฐ
iOS ์ฑ๊ฐ๋ฐ/iOS
[iOS] - Table View & Collection View (ํ ์ด๋ธ ๋ทฐ, ์ปฌ๋ ์ ๋ทฐ)
B_log 2021. 4. 13. 15:44๋ฐ์ํ
๐ค Table View and Collection View
๐ง Table View, Collection View ๋?
- UIScrollView์ ์๋ธํด๋์ค๋ก ๋ฌดํํ ์์(unbounded) ์ ๋ณด์ ๋ฌดํํ ์ ๊ทผ์ ์ ๊ณตํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ํ์ง๋ง ์๋ฃ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ฐฉ์์์ ์ฐจ์ด๊ฐ ๋ฐ์ํฉ๋๋ค.
- Table View: ์ ๋ณด๋ฅผ ํ๋์ ๊ธด ๋ฆฌ์คํธ๋ก ๋ณด์ฌ์ค๋๋ค(์น์ ๋ถ๋ฆฌ๋ ๊ฐ๋ฅํฉ๋๋ค).
- Collection View: ๋ค์ํ ๋ฐฉ์์ด ๊ฐ๋ฅํ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ณด๋ฅผ 2D ํฌ๋งท์ผ๋ก ๋ณด์ฌ์ค๋๋ค(์ฃผ๋ก text flow ๊ฐ์ flowing์ผ๋ก). ์ฌ๊ธฐ์ text flow๋ ๊ธ์ ์ฝ๋ฏ์ด ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก, ๊ทธ๋ฆฌ๊ณ ๋ค์ ์ค๋ก ์ด์ด์ ๊ณ์ ์์ฑํ๋ ๋ฐฉ์์ ๋งํฉ๋๋ค. ์ปฌ๋ ์ ๋ทฐ๋ ์ปค์คํฐ๋ง์ด์ง์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๊ฒฐ๊ตญ ๋ View์ ์ฐจ์ด๋ ํ๋๋ ํ์ผ๋ก ๋์ดํ์ฌ ์๋ฃ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด๊ณ , ๋ค๋ฅธ ํ๋๋ 2์ฐจ์์ผ๋ก ๋์ฌ์ง ๋ฌด์์์(arbitrary) ์์ดํ ์ด๋ผ๋ ๊ฒ์ ๋๋ค.
๐ Table View
- Table View์ ๊ธฐ๋ณธ์ ์ธ ํํ๋ ์๋์ ๊ฐ์ต๋๋ค
- Table View์ ํ์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ผ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ๋ฌถ์ธ ๊ทธ๋ฃน์ ์น์ ์ด ๋ฉ๋๋ค. ์น์ ์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ๊ณ ์ ๋ (static) ๋๋ง ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์์ ๋ฆฌ์คํธ ๊ฐ์ด ๋งค๋ฒ ๋ฐ๋๋ ์์์(arbitrary) ๋ฌด์์ํ ์ ๋ณด์๋ ์ฌ์ฉํ์ง ์์ต๋๋ค.
- ์ค์ ํ๋ฉด์ ๊ฒฝ์ฐ ํญ์ ๋ด์ฉ์ด ๊ณ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ Section์ ํ์ฉํ์ฌ ๊ตฌํํ์ต๋๋ค.
- ๋ํ์ ์ธ Table View์ ์์๋ก ์ค์ (settings) ํ๋ฉด์ด ์์ต๋๋ค.
๐ฑ Collection View
- Collection View์ ๊ธฐ๋ณธ์ ์ธ ํํ๋ ์๋์ ๊ฐ์ต๋๋ค.๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ธฐ๋ณธ์ ์ผ๋ก 2D๋ก ๋ฐฐ์น๋์ด ์์ต๋๋ค. ์์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ํ์ด ์กด์ฌํ๋ ๊ฒ ๊ฐ์ง๋ง ์ค์ ๋ก ํ์ ์กด์ฌํ์ง ์์ต๋๋ค. ๋จ์ํ ์ค์์ ์ค๋ก ๋ฐฐ์น๋ ํํ์ ๋๋ค. ๋ง์ฝ ํฌ๊ธฐ๊ฐ ๋ฌ๋๋ค๋ฉด ํ์ด ์กด์ฌํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง ์์ ๊ฒ์ ๋๋ค.
- Collection View๋ section์ ๊ฐ์ง ์ ์์ต๋๋ค.
๐ง How to use?
- ํ๋ ํธ์์ ์ง์ View๋ฅผ ๋๋๊ทธํด์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค. ํ๋ ํธ์์ Table์ ๊ฒ์ํด๋ณด๊ฒ ์ต๋๋ค.Table View๋ฅผ ์ง์ ๋ฃ๊ฑฐ๋ Table View Controller๋ฅผ ํตํด ์๋ก์ด Controller๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- MVC์์ ์ ์ฒด ๋ทฐ๊ฐ Table View์ด๊ฑฐ๋ Collection View๋ผ๋ฉด ์์ Controller ์ต์ ์ ํตํด ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
- Collection View ์ญ์ ๋ง์ฐฌ๊ฐ์ง ์ ๋๋ค.
๐ Data๋ฅผ ์ด๋์์ ๋ฐ์ ์ ์์๊น?
- ์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ MVC์์ View๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ๊ทธ๋์ ํ ์ด๋ธ ๋ทฐ์์ ์ ์ํ var(๋ณ์)์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํ ์ด๋ธ ๋ทฐ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํด์ผ ํฉ๋๋ค. ์ด ๋ฐฉ์์ delegation๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
- data Source๋ผ๋ ๋ณ์๊ฐ ์๊ณ View๊ฐ ์ด ๋ณ์๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค. dataSource์ ํ์ ์ ํ๋กํ ์ฝ์ด๊ณ ์ด ํ๋กํ ์ฝ์๋ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ํ ๋ญ์น์ ๋ฉ์๋((bunch of methods)๊ฐ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ฌ๋ผ๊ณ ์์ฒญํ๋ ๋ฐฉ์์ผ๋ก table view๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ป์ต๋๋ค.
๐ฏ dataSource, delegate ๊ตฌํํ๊ธฐ
// Table View
var dataSource: UITableViewDataSource
var delegate: UITableViewDelegate
// Collection View
var dataSource: UICollectionViewDataSource
var delegate: UICollectionViewDelegate
- UI-ViewDataSource์ UI-ViewDelegate์ ์์์ ์ธ๊ธํ ํ ๋ญ์น์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- numberOfSections: section์ ๋๋๋ ๋ฉ์๋๋ก ์ด ๋ฉ์๋๋ฅผ ๊ตฌํํ์ง ์์ผ๋ฉด ์น์ ๊ตฌ๋ถ์ด ์์ด ํ๋์ ์น์ ์ด ๋ฉ๋๋ค.
- tableView or collectionView(numberOfRowsInSection): ํ ์น์ ์ ๋ช๊ฐ์ ํ์ด ์๋์ง ์ ํ๋ ๋ฉ์๋์ ๋๋ค. ๊ฐ ์น์ ์ ์ง์ ๋ฌผ์ด๋ณด๊ฒ ๋ฉ๋๋ค. Collection View์ ๊ฒฝ์ฐ์๋ ์ด ์น์ ์ ๋ช ๊ฐ์ ์์ดํ ์ด ์๋์ง ๋ฌป์ต๋๋ค.
- tableView or collectionView(cellForItemAt): ๊ฐ ํ/์์ดํ
์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๋ฉ์๋์
๋๋ค.
๐ IndexPath:- ๋งค์ฐ ์์ ๊ตฌ์กฐ์ฒด์ ๋๋ค. ์ฌ๊ธฐ์ ์น์ ๊ณผ ํ ๋๋ ์น์ ๊ณผ ์์ดํ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์น์ ๊ณผ ํ์ ํฉ์ณ์ ๋ํ๋ด๋ ๋ฐฉ์์ ๋๋ค. ๊ทธ๋์ Table View๋ Collection View๋ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ์ ์๊ณ , ์ด ๋ฉ์๋๋ IndexPath๋ฅผ ์ ๊ณตํฉ๋๋ค.
- IndexPath๋ ๋ณ์๋ก row, item, section์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ๋ฉ์๋์ return type์ (Table View์ ๊ฒฝ์ฐ) UITableViewCell ์ ๋๋ค. ์ด๊ฒ์ UI ๋ทฐ์ ์๋ธํด๋์ค์ ๋๋ค.
- ์ด view๋ ํ์ ๊ทธ๋ฆฌ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- tableView ์์ cell์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.cell์ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉํ reuse ๋ฉ์๋๋ฅผ ๋ถ์ํด๋ณด๊ฒ ์ต๋๋ค.
func tableView(_ tv: UITV, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tv.dequeueReusableCell(withIdentifier: "MyCellId". for: indexPath) }
// UITableView func numberOfSections(in tableView: UITV) -> Int func tableView(_ tv: UITV, numberOfRowsInSection section: Int) -> Int func tableView(_ tv: UITV, cellForRowAt indexPath: IndexPath) -> UITableViewCell // UICollectionView func numberOfSections(in collectionView: UICV) -> Int func collectionView(_ tv: UICV, numberOfItemsInSection section: Int) -> Int func collectionView(_ tv: UICV, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
๐ Cell Reuse(์ ์ฌ์ฌ์ฉ)
- ์์ดํ์ 10,000 ๊ณก์ ์์ ์ด ์๋ค๊ณ ์๊ฐํด๋ณด๊ฒ ์ต๋๋ค. ์ด๊ฒ์ Table View๋ก ๋ณด์ฌ์ค ๋ ์จ๋ฒ ์์ผ, ๊ณก๋ช , ๊ฐ์ ๋ฑ์ ์ ๋ณด๋ 10,000๊ฐ์ด๊ณ ๋ง ๊ฐ์ UI ๋ทฐ๋ฅผ ๊ฐ๋๋ค๋ ๊ฒ์ ๋งค์ฐ ๋นํจ์จ์ ์ ๋๋ค. ๊ทธ๋์ ์ค์ ํ ์ด๋ธ ๋ทฐ๋ ๋ณด์ฌ์ง๋ ํ๋ง UI ํ ์ด๋ธ ๋ทฐ ์ ์ ์์ฑํฉ๋๋ค. ์คํฌ๋กค์ ํด์ ์ด๋ค ์ ์ด ๋งจ ์๋ก ๊ฐ๊ฒ ๋ผ๋ฉด ์ด๋ ์ฌ์ฌ์ฉ๋์ ๋งจ ์๋์ ๋์ฌ์ง๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์คํฌ๋กค์ ํ๋ ๋์ ๋ฐ๋ณต์ ์ผ๋ก ๋ทฐ๋ ์ฌ์ฌ์ฉ๋ฉ๋๋ค.
- ์์ ๋ด์ฉ์ ๊ตฌ์กฐ์ ์ผ๋ก ์ค๋ช
ํด๋ณด๋ฉด ์คํฌ๋กค์ ํ ๋ ํ๋์ UITableViewCell์ ์ฌ์ฌ์ฉ ํ(a pool to be reused)๋ก ๊ฐ์ dequeueReusableCell ๋ฉ์๋๋ฅผ ํตํด ์
์ ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค.
๐ง ์ ReusableCell์ด Queue๋ก ๊ตฌํ๋์ด ์์๊น ๊ณ ๋ฏผํด๋ดค์ต๋๋ค. ์ฌ๋ฌ๊ฐ์ง ์๋ฃ๊ตฌ์กฐ๊ฐ ์๋๋ฐ ๋ง์ด์ฃ ! ์ฒ์์๋ data๊ฐ ๋ด๊ฒจ์๋ ์ฑ๋ก cell์ ์ ์ฅ๋์ด ๋ด์ฉ์ด ๊บผ๋ด์ง๋ค๊ณ ์๊ฐํ์ฌ Stack์ด ๋ ๋ง์ง์์๊น ์๊ฐํ์ต๋๋ค. ์คํฌ๋กค์ ์๋ก ์ฌ๋ ค ์ ์ด ์ฌ๋ผ์ก๋ค๊ฐ ๋ค์ ๋ด๋ฆฌ๋ฉด ์ญ์์ผ๋ก ๋์์ผ ํ๋ค๋ ์๊ฐ์ ํ์์ต๋๋ค. ํ์ง๋ง ์ค์ ๋ก๋ ์ ์์ฒด๋ง ๋ฐ๋ณต์ฌ์ฉํ๋ ๊ตฌ์กฐ์์ต๋๋ค. ๊ทธ๋์ ๋จผ์ ๋ค์ด๊ฐ ์๋ ์ ์ด ๋จผ์ ๋์ค๋ ๊ตฌ์กฐ๊ฐ ๋ ํฉ๋ฆฌ์ ์ด๋ฏ๋ก FIFO(First In First Out)์ ๊ตฌ์กฐ๋ก ๊ตฌํ๋ ๊ฒ ๊ฐ์ต๋๋ค. - ๋ง์ฝ์ ๋ฐฉ๊ธ ์คํฌ๋ฆฐ์ด ์ผ์ ธ์ ์ฌ์ฌ์ฉํ ์ ์๋ Cell์ด ์์ ๊ฒฝ์ฐ๋ ์ด๋ป๊ฒ ํ ๊น์? ๋ฐ๋ก ์คํ ๋ฆฌ๋ณด๋์์ ๋ง๋ ํ๋กํ ํ์ ์ ๋ณต์ฌํด์ ์์ฑํ๊ฒ ๋ฉ๋๋ค. ๋ ์ด๋ธ, ๋ฒํผ, ์ด๋ฏธ์ง ๋ฑ์ ์ฌ์ฉํด์ ์ ์ ๋ชจ์์ ๋ง๋ค๊ณ ์คํ ๋ ์ด์์ ๋ฑ์ ์ฌ์ฉํด ์ ์ ๊ณ ์ ์ํค๋ฉด ์ ์ด ํ์ํ ๋๋ง๋ค ์คํ ๋ฆฌ๋ณด๋์์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๊ณ ์ด๋ฅผ ์ฌ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.๊ทธ๋์ ์ฌ์ฌ์ฉํ ์ ์ ๋ํด ๋งํ๊ณ , ๋ง์ฝ ์ฌ์ฌ์ฉํ ์ ์ด ์๋ค๋ฉด ์คํ ๋ฆฌ๋ณด๋์ ๋ณด์ด๋ ์ด ์ ์ ๋ณต์ฌํด์ ๋ง๋ค๊ฒ ๋ฉ๋๋ค. ์์ ๊ตฌ๋ฌธ์ ๋ค์ ๋ถ์ํด๋ณด๋ฉด"์์ cell์ ์ ์ธํ๋ค, UI Table View์ dequeueReusableCell์์ "MyCellId"๋ผ๋ identifier๋ฅผ ๊ฐ์ง Cell์ indexPath์ ์ ๋ณด๋ฅผ ๋ฃ์ด ๊ฐ์ ธ์จ๋ค"
- ๋ผ๊ณ ํด์ํ ์ ์์ต๋๋ค.
let cell = tv.dequeueReusableCell(withIdentifier: "MyCellId". for: indexPath)
- Reuse์์ ์ฃผ์ํด์ผํ ์ ์ด ์์ต๋๋ค.ํด์ํ๋ฉด ์ ์ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ ๋ฉํฐ์ค๋ ๋ฉ์ ์ฌ๊ฐํ ์ํฅ์ ์ค ์ ์๋ค๋ ์ด์ผ๊ธฐ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ค row์ ๋ถ๋ฌ์์ผํ ๋ฐ์ดํฐ ์ค ์ด๋ฏธ์ง๊ฐ ์๊ณ ํ ์ค๋ ๋์์ ์ด๊ฒ์ ๋ถ๋ฌ์ค๊ธฐ ์ํด ์ธํฐ๋ท์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์์ ์ ์์ํฉ๋๋ค. ์ด ์์ ์ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค. ๊ทธ ์ฌ์ด ์ฌ์ฉ์๊ฐ ์๊ฐ๋ฝ์ผ๋ก ์คํฌ๋กคํด์ ๊ทธ ์ ์ ๋ณด๋ด๋ฒ๋ฆฌ๊ณ ์ด ์ ์ ์ฌ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋ผ ์ฑ์ ์ด๋ฏธ ๋ค๋ฅธ ์ ์ ๋ด์ฉ์ ๋ด์ ๋ณด์ฌ์ฃผ๋๋ฐ ์๋ก์ด ์ด๋ฏธ์ง๊ฐ ์๋ ๊ธฐ์กด์ ์์ฒญ๋ ์ด๋ฏธ์ง๊ฐ ์ ์ ๋์ฐฉํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ์ฃผ์ํ์ง ์์ผ๋ฉด ๋ค๋ฅธ ์ ์ ์ด๋ฏธ์ง๋ฅผ ์๋ก์ด ์ ์ ๋ณด์ฌ์ฃผ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฏธ์ง๊ฐ ์ค๋ฉด ์ด ์ด๋ฏธ์ง๊ฐ ์ด๊ฒ์ ์์ฒญํ ์ ์ด ์ฌ์ ํ ํ๋ฉด์ ๋ณด์ฌ์ง๊ณ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ธ ๋ฉํฐ์ค๋ ๋ฉ ๋ฌธ์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ฉด ํ๋ฉด์ ์ฌ์ ํ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ ์์ ์ด ํ์ํฉ๋๋ค. ๊ทธ๋์ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ๋ณผ ์ ์์ต๋๋ค.decision์ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง, ์ด๋ค section์ ์กด์ฌํ๋์ง ๋ฑ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. ์ด ๊ฒฐ์ ๋ ๊ฒฐ๊ณผ๋ prototype์ด ๋๊ณ ํ๋กํ ํ์ ์์ฒด๋ฅผ identifier๋ก ๊ฒฐ์ ํ์ฌ cell์ ๋ถ๋ฌ์ค๋ฉด ๋ฉํฐ์ค๋ ๋ฉ์์ ๋ฐ์ํ๋ cell reuse์ ๋ค๋ฅธ ๋ฐ์ดํฐ๊ฐ ๋ถ๋ฌ์์ง๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
func tableView(_ tv: UITV, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let prototype = decision ? "FoodCell" : "CustomFoodCell" let cell = tv.dequeueReusableCell(withIdentifier: prototype. for: indexPath) cell.textLabel?.text = food(at: indexPath) cell.detailTextLable?.text = emoji(at: indexPath) }
- The fact that cells are reused has serious implications for multithreading!
๐ Loading up Cells(์ ๋ถ๋ฌ์ค๊ธฐ)
- ํ article์ ์ธ์ฉํด๋ณด๊ฒ ์ต๋๋ค.์์ ๋ฌธ์ฅ์ ํด์ํด๋ณด๋ฉด custom UI๋ฅผ UITableViewCell prototype์ ๋ฃ์ ๋ outlet์ด ํ์ํ์ง๋ง Controller์ ์ง์ ์ฐ๊ฒฐํ ์ ์๋ค๋ ๋ป์
๋๋ค. ๊ธฐ์กด์ IBOutlet์ ํตํด ์ฐ๊ฒฐํ์ ๋๋ ํ๋์ ๊ฐ์ View์์ ๋ถ๋ฌ์ค๊ธฐ์ํด ์ง์ ์ฐ๊ฒฐํ๋๋ฐ, TableView์์๋ ์์ฒญ๋๊ฒ ๋ง์ cell์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ผ์ผ์ด ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ๋ ํ๋์ single outlet์ ์ฐ๊ฒฐ๋๊ธฐ ์ํด์๋ ๋ฐฐ์ด ๋ฑ์ ์ฌ์ฉํด์ผํ๋๋ฐ ๊ทธ๋ผ ๋๋ฌด ๋ณต์กํ ๊ตฌ์กฐ๊ฐ ๋ฉ๋๋ค. ๊ทธ๋์ ์ฒ์์ผ๋ก outlet์ View์ ๊ตฌํํ๊ฒ ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด View๋ UITableViewCell์ ์๋ธํด๋์ค์ด์ด์ผ ํฉ๋๋ค.์ด๋ ๊ฒ ๊ตฌํํ๋ฉด ๊ฐ๊ฐ์ ํ์ ์์ ๋ง์ TableViewCell์ด ์๊ณ ๊ฐ๊ฐ์ TableViewCell์ ์์ ๋ง์ ์์ธ๋ ์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
func tableView(_ tv: UITV, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let prototype = decision ? "FoodCell" : "CustomFoodCell" let cell = tv.dequeueReusableCell(withIdentifier: prototype. for: indexPath) if let myTVCell = cell as? MyTVC { myTVC.name = food(at: indexPath); myTVC.emoji = emoji(at: indexPath) } }
- ์ปค์คํ UITableViewCell ์๋ธํด๋์ค๋ฅผ ์์ฑํ ๋์๋ ๋ฐ๋์ ์์ ํ๋กํ ํ์ ํ์ด ์ ํ๋ ์ํ์์ ์งํํด์ผ ํฉ๋๋ค. ์๋ํ๋ฉด default๋ก UITableViewCell ํด๋์ค๋ก ์ค์ ๋์ด์๊ธฐ ๋๋ฌธ์ myTVC ํด๋์ค๋ก ๋ณ๊ฒฝํด์ฃผ์ด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ฝ๋๋ก ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
class myTVC: UITableViewCell { @IBOutlet var name: UILabel @IBOutlet var category: UILabel @IBOutlet var details: UILabel }
- When we put custom UI into a UITableViewCell prototype, we probably need outlet to it.No, we can't, because there might be multiple rows with that type of cell
- They can't all be hooked up to the same single outlet!
- Can we hook them up directly to our Controller?
๐ข Static Table View
- staticํ ํ ์ด๋ธ ๋ทฐ๋ ์ผ๋ฐ์ ์ธ ํ ์ด๋ธ ๋ทฐ์ ๋ค๋ฅด๊ฒ ๋ฌด์์์(arbitrary) ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด ์๋๋ผ ๊ณ ์ ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค(e.g. ์ค์ ํ๋ฉด). ์ด๋ฐ ๊ฒฝ์ฐ๋ ํ๊ณผ ์น์ ์ ๊ฐ์๊ฐ ์ ํด์ ธ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์๋ฅผ ์ธ๋ ๋ฑ์ ํจ์๋ ํ์ํ์ง ์์ต๋๋ค. cellForRowAt ์ญ์ ํ์ํ์ง ์์ต๋๋ค. ์ด ๋์๋ ์คํ ๋ฆฌ๋ณด๋์ ์ปจํธ๋กค๋ฌ์ ํ์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์์ฑํ๋ฉด ๋ฉ๋๋ค. ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
๐ง How to use?
โ
- ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด Table View์ Content๋ฅผ Static Cells๋ก ๋ฐ๊ฟ์ฃผ๊ณ Style์ Grouped๋ก ์ค์ ํด์ค๋๋ค.
๐ ๋ง์ฝ ๋ชจ๋ธ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด?(What if your Model changes?)
- ์์ดํ์ ์์ ์ด ์ถ๊ฐ๋๊ฑฐ๋, ์์ ๋ฆฌ์คํธ์ ์์์ด ์ถ๊ฐ๋ ๋ Table View๋ Collection View๋ ์ ๋ฐ์ดํธ ๋์ด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ๋ View์๋ reloadData() ๋ผ๋ function์ด ์กด์ฌํฉ๋๋ค. ์ด ํจ์๋ ๋ณด์ฌ์ง๋ ๋ชจ๋ ์ ์ ๋ํด ๋ค์ ํธ์ถ(reload)ํฉ๋๋ค. ์ฝ๊ฐ ๋ฌด๊ฑฐ์ด ๋ฉ์๋์ด์ง๋ง ๊ทธ๋ ๊ฒ ๋ฌธ์ ๋ ๊ฒ์ด ์์ต๋๋ค. ๋ฐ์ดํฐ ์ ์ฒด๋ฅผ reload ํ๋ ๊ฒ์ด ์๋๋ผ ๋ณด์ฌ์ง๋ ์ ์ ๋ํด์๋ง ํธ์ถ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๐ row์ ๋์ด ์ค์ ํ๊ธฐ
- Table์ด ๊ฐ์ง Row์ ๋์ด๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์ธ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- rowHeight ์ฌ์ฉํ๊ธฐ
- rowHeight๋ ํ ์ด๋ธ ๋ทฐ์ ๋ณ์์ ๋๋ค. ์คํ ๋ฆฌ๋ณด๋์์ ์ค์ ๊ฐ๋ฅํ๋ฉฐ ํญ์ ๊ทธ ๋์ด๊ฐ ๋๋๋ก ํ์ ๊ณ ์ ์ํต๋๋ค.
- ์คํ ๋ ์ด์์ ํ์ฉํ๊ธฐ
- Auto Layout์ ํ์ฉํด ํ ๋์ด๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ณต์กํ ๊ฒฝ์ฐ์ ์ ์ ํด๋นํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ณผ์ผ์ ๋ํ ๋ํ ์ผํ ์ ๋ณด๊ฐ ๋ง๋ค๋ฉด ์ ์ ํฌ๊ธฐ๋ ์ปค์ ธ์ผํฉ๋๋ค. ๋ฐ๋๋ก ์ ๋ณด์ ์์ด ์๋ค๋ฉด ์ ์ ํฌ๊ธฐ๋ ์์์ ธ์ผํฉ๋๋ค. ์ ๋๋ก ์ค์ ํ๋ค๋ฉด ์ผ๋ฐ์ ์ธ ๋ทฐ๊ฐ ํ์ ๋์ด๋ฅผ ์กฐ์ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ UIView๋ฅผ ํ ๋ด๋ถ์์ ์์ ๋ทฐ๋ก ๋๊ณ ์ ๋ณด๋ฅผ ์ ๋ ฅํฉ๋๋ค. ์ด๋ฅผ ๋๋ฌ๋ด๋ ์ ์ฝ์ ์ค์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ ๊ฐ์ฅ์๋ฆฌ์ ๊ทธ ์ผ๋ฐ์ ์ธ ๋ทฐ๋ฅผ ๋๋ฌ๋ด๋๋ก ์ ์ฝ์ ์ค์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ ์ด๋ธ ๋ทฐ๊ฐ ๋ํ๋๋ฉด ์คํ ๋ ์ด ์์์ผ๋ก์ธํด ์ด๋ค ํฌ๊ธฐ๋ฅผ ๊ฐ์ ธ์ผํ๋์ง ์ ์ ์๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ์ํด 1๋ฒ์ rowHeight๊ฐ ์๋๋ผ UITableViewAutomaticDimension์ผ๋ก ์ค์ ํฉ๋๋ค.
- tableView ๋ฉ์๋ ์ด์ฉํ๊ธฐ
- tableView(heightForRowAt indexPath: ) ๋ฉ์๋๋ฅผ ํตํด row์ ๋์ด๋ฅผ ์กฐ์ ํ ์ ์์ต๋๋ค. ์ด ๋ฉ์๋๋ ํด๋น ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง ํ์ ๋์ด๋ฅผ ๋ฐํํฉ๋๋ค. Auto Layout ์์ด ํจ๊ณผ์ ์ผ๋ก ๋์ด๋ฅผ ๊ณ์ฐํ ์ ์๋ค๋ฉด ์ด๊ฒ์ ์ข์ ๋ฐฉ์์ด ๋ ์ ์์ต๋๋ค.
- Collection View์ ๊ฒฝ์ฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Table View์ ๊ฐ์ง๋ง sizeForItemAt์ด๋ผ๋ ์์๊ฐ ํ๋ ์ถ๊ฐ๋ฉ๋๋ค. ์๋ํ๋ฉด Collection View๋ ์ค๋ก ๋์ด ์๋ ๊ฒ์ด ์๋๋ผ ํ๋์ ์์๊ฐ Rectangleํ๊ฒ ๊ตฌ์ฑ๋์ด ์์ผ๋ฏ๋ก ๊ณตํต์ ์ธ ๋์ด๊ฐ ์์ต๋๋ค.
๐ฆ Table View์ Header ๋ฃ๊ธฐ
- Table View๊ฐ ์ฌ๋ฌ ์น์ ์ ๊ฐ์ง๊ณ ์์ ๋ ์น์ ์ ์ด๋ฆ(header)์ ๋ฃ๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค. ์๋์ ๋ฉ์๋๋ฅผ ํ์ฉํฉ๋๋ค.
func tableView(_ tv: UITV, titleForHeaderInSection section: Int) -> String?
Reference: Stanford CS193p by Paul Hegarty
๋ฐ์ํ
'iOS ์ฑ๊ฐ๋ฐ > iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
๋ฐ์ํ
๊ณต์ง์ฌํญ
์ต๊ทผ์ ์ฌ๋ผ์จ ๊ธ
์ต๊ทผ์ ๋ฌ๋ฆฐ ๋๊ธ
- Total
- Today
- Yesterday
๋งํฌ
TAG
- ํ ๋งํ #๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ์ฟผ๋ํธ๋ฆฌ#BOJ#๋ถํ ์ ๋ณต#Python
- ์ํธ์ฝ๋#dp#BOJ#Python
- ๋ ์ง ๊ณ์ฐ#BOJ#์์ ํ์#Python
- Brackets#Stacks and Queues#Codility#Python
- ๊ณต์ ๊ธฐ ์ค์น#BOJ#์ด๋ถํ์#Python
- django#slicing
- ๋ณ๋ ๋์ดํธ#BOJ#ํ์๋ฒ#Python
- ํ ํ๋ก์ ํธ#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- Distinct#Codility#Python
- ํ์ด์ฌ์๊ณ ๋ฆฌ์ฆ์ธํฐ๋ทฐ#4์ฅ
- PassingCars#Codility#Python
- ๋ฏธ๋ก ํ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- NumberofDiscIntersections#Codility#Sort#Python
- filter#isalnum#lower
- API#lazy#
- Triangle#Sorting#Codility#Python
- N์ผ๋ก ํํ#DP#Programmers#Python
- django
- ๋ฐ๋ณต์์ด#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ๋ฆฌ๋ชจ์ปจ#์์ ํ์#BOJ#Python
- ๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ#BackTracking
- ํฐํ๋น์น#๋ฆฌ์ฝ#xbox#controller
- Swift#Tuples#Range
- ๋๋ฌด์๋ฅด๊ธฐ#BOJ#์ด๋ถํ์#Python
- ๋์ ์๋ฅด๊ธฐ#์ด๋ถํ์#BOJ#Python
- ์ฌ์๊ฐ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ๋ฐฐ์ดํฉ์น๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- ์์ด์ฌ์ดํด#BOJ#Python
- ์ข ์ด์๋ฅด๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
๊ธ ๋ณด๊ดํจ