๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
๋ฌธ์
์ฌ์ง ๋ด ๋ฒํผ ์ ํํ๊ธฐ
1. cell ๋ด ๋ฒํผ ์ด๋ฒคํธ ๋ฐ์์ํค๊ธฐ
UICollectionViewControllerDelegate์ collectionView(_:didSelectItemAt:) ๋ฉ์๋๋ฅผ ํตํด collectionView Cell์ ์ ํ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค. ํ์ง๋ง ์ด ์ด๋ฒคํธ๋ cell์ ์ด๋ฒคํธ๋ฅผ ์๋ฏธํ์ง cell ๋ด ๋ฒํผ์ ์ด๋ฒคํธ๋ฅผ ์๋ฏธํ์ง๋ ์๋๋ค. ์ฐ๋ฆฌ๋ ๋ฒํผ์ด cell ๋ด์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ด์ผ ํ๋ค.
collectionView(_:didSelectItemAt:)
๋ธ๋ฆฌ๊ฒ์ดํธ์ ํน์ ํ ์ธ๋ฑ์ค์ ์์ดํ ์ด ์ ํ๋์์์ ์๋ฆฐ๋ค.
๋ฒํผ์ ์ ํ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ํด๋นํ๋ ์ก์ ํจ์๊ฐ ํธ์ถ๋๋ฏ๋ก, ์ก์ ํจ์ ๋ด์ ์ฌ์ง์ ์ ํํ๋ ์์ ์ ๊ตฌํํ๋ฉด ๋๋ค. ํ์ง๋ง ์ ์ฒด ์ฌ์ง๋ชฉ๋ก๊ณผ ์ ํ๋ ์ฌ์ง ๋ชฉ๋ก์ ImagePickerViewController์ ์๊ธฐ ๋๋ฌธ์ ImageCollectionViewCell์์๋ ์ํ๋ ์์ ํ ์ ์๋ค. ๊ทธ๋ผ ์ด๋ป๊ฒ ํด์ผํ ๊น?
2. Delegate ํจํด
Delegate
delegate๋ '์์ํ๋ค.'๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ฉฐ ํ๋กํ ์ฝ๋ก ๊ตฌํ๋๋ค.
์) A.delegate = B
A๊ฐ ํด์ผํ ์์ ์, B๊ฐ ๊ถํ์ ์์๋ฐ์ ์ํํ๋ค.
Delegate ํจํด์ ์ฌ์ฉํ๋ฉด ImageCollectionViewCell์์ ์ด๋ฃจ์ด์ ธ์ผ ํ ์์ ์ ImagePickerViewController์์ ๊ตฌํํ ์ ์๋ค. ๊ทธ๋ ๊ฒ ImagePickerViewController์์ ๊ตฌํํ ๋ฉ์๋๋ฅผ ๋ฒํผ์ ์ก์ ํจ์์์ ํธ์ถํ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
//ImageCollectionViewCell.swift
protocol ImageCollectionViewCellDelegate: AnyObject {
func didSelectCountButton(_ cell: ImageCollectionViewCell)
}
class ImageCollectionViewCell: UICollectionViewCell {
...
weak var delegate: ImageCollectionViewCellDelegate?
...
private func ๋ฒํผ์ ์ก์
ํจ์(){
delegate?.didSelectCountButton(self)
}
}
- delegate๋ ์ฐธ์กฐ์ํ์ ํผํ๊ธฐ ์ํด weak ํ์ ์ผ๋ก ์ ์ธ๋์ด์ผ ํ๋๋ฐ, weak ํ์ ์ ์ด๊ฑฐํ, ๊ตฌ์กฐ์ฒด ๋ฑ ํด๋์ค๊ฐ ์๋ ๊ณณ์์๋ ์ฌ์ฉ๋ ์ ์๋ค. ๋ฐ๋ผ์ ํด๋น ํ๋กํ ์ฝ์ด ํด๋์ค์์๋ง ์ฑํ๋๋ค๋ ๊ฒ์ ๋ช ์ํด ์ฃผ๊ธฐ ์ํด AnyObject๋ฅผ ์์ํด์ค๋ค.
- AnyObject: ํด๋น ํ์ ์ ์์๋ฐ๋ ํ๋กํ ์ฝ์ ์๋ฌต์ ์ผ๋ก ํด๋์ค์๋ง ์ฑํ๋๋ ํ๋กํ ์ฝ์ด๋ค.
//ImagePickerViewController.swift
extension ImagePickerViewController: ImageCollectionViewCellDelegate {//ํ๋กํ ์ฝ ์ฑํ
func didSelectCountButton(_ cell: ImageCollectionViewCell) {
...
}
}
3. delgate ์์๋ฐ๊ธฐ
์ ๋ฆฌ๋ฅผ ํ์๋ฉด, ImageCollectionViewCell(cell)์ ๋ฉ์๋๋ฅผ ImagePickerViewController(collection)์์ ๋์ ๊ตฌํํด์ฃผ๋ ๊ณผ์ ์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ด ๋์ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋์ด ์์๊น? ๋ฐฉ๋ฒ์ delegate ํ๋กํผํฐ์ด๋ค. ์์๋ฐ๋ ํด๋์ค์์ ํด๋น delegate ํ๋กํ ์ฝ์ ์ฑํํ๊ณ ์์ํ๋ ํด๋์ค์ delegate ํ๋กํผํฐ์ ์์ (self)์ ํ ๋นํ๋ฉด ์๋ก ์ฐ๊ฒฐ๋๋ค.
ImageCollectionViewCell.delegate = self
์ฌ๊ธฐ์ ์ฃผ์ํด์ผ ํ ์ ์ ๊ฐ cell ๋ง๋ค ์์ ์ ์์ํด์ฃผ์ด์ผ ํ๋ค๋ ์ ์ด๋ค. ๋ชจ๋ ์ฌ์ง์ ์ ํ ๋ฒํผ์ด ์กด์ฌํ๋ค. ์ฆ, ๋ชจ๋ cell์์ ์ ํ ์ด๋ฒคํธ๊ฐ ํ์ํ๋ค. ๋ฐ๋ผ์ ๊ฐ cell ๋ง๋ค ์์ ์ ImageCollectionViewController์ ์์ํด์ฃผ๋ ์์ ์ด ํ์ํ๋ค.
ImageCollectionViewController ํด๋์ค์์ ๋ชจ๋ cell๋ค์ ๊ฐ๊ฐ ๋ง๋๋ ๋ถ๋ถ์ด ์๋๋ฐ, ๋ฐ๋ก UICollectionViewControllerDataSource์ collectionView(_:cellForItemAt:) ๋ฉ์๋์ด๋ค. ์ด ๋ฉ์๋๋ cell์ ๊ตฌ์ฑํ์ฌ collctionView์ ๋ฐํํ๋ ๋ฉ์๋์ด๋ฏ๋ก ๋ชจ๋ cell์ ํด๋์ค์ ์ ๊ทผํ๋ค.
//ImagePickerViewController.swift
extension ImagePickerViewController: UICollectionViewDataSource {
...
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = self.imageCollectionView.dequeueReusableCell(withReuseIdentifier: ImageCollectionViewCell.identifier, for: indexPath) as? ImageCollectionViewCell else {return UICollectionViewCell()}
cell.delegate = self
...
return cell
}
}
Delegate
Delegate ํจํด์ด๋?
Delegate ํจํด์ ์ฌ์ฉํ ๋ AnyObject๋ฅผ ์์๋ฐ๋ ์ด์ ์ weak๋ฅผ ์ฌ์ฉํ๋ ์ด์