๐Custom Delegate Pattern
๋ฉค๋ฒ๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ/์์ ํด ํ ์ด๋ธ ๋ทฐ์ ํ์ํ๋ ์ฑ
DetailVC์์ ๋ฉค๋ฒ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ฉค๋ฒ ์ ๋ณด๋ฅผ ์ ๋ฐ์ดํธํ๋ฉดVC์์ ํด๋น ์ ๋ณด๊ฐ ์ ๋ฐ์ดํธ๋๋๋ก ๊ตฌํ(VC: tableViewController)๐๋์์ธ ํจํด : MVC ํจํด(View: Code ๊ตฌํ)
๐๋ฐ์ดํฐ
Member(name: name, age: age, phone: phone, address: address)๐๋ฐ์ดํฐ์ ํ๋ฆ
DetailVC(Sender) โVC(Receiver)DetailVC๊ฐ ์ผ์ ์ํค๊ณVC๊ฐ ๋ฐ์ ์ผ์ ๋์ ์ฒ๋ฆฌ
1. ๋ชจ๋ธ์ ๋ธ๋ฆฌ๊ฒ์ดํธ ํ๋กํ ์ฝ ๊ตฌํ
protocol MemberDelegate: AnyObject {
ย ย func addNewMember(_ member: Member)
ย ย func update(index: Int, _ member: Member)
}- ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ weak์ผ๋ก ์ ์ธํ ๊ฒ์ด๋ฏ๋ก
AnyObject์์
weak๊ณผ AnyObject
weak์ ์ค์งclass์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ โclass์๋ง ์ฑํํ ์ ์๋ ํ๋กํ ์ฝ๋ก ๋ง๋ค์ด์ผ ํจ โAnyObject์์๐AnyObject ํด๋์ค ํ์ ์ธ์คํด์ค๋ง์ ๋ํ๋
2. ์ผ์ ์ํฌ ์ปจํธ๋กค๋ฌ(Sender)์์ ๋ธ๋ฆฌ๊ฒ์ดํธ ํ๋กํ ์ฝ ๋ณ์ ์ ์ธ
class DetailViewController: UIViewController {
ย ย weak var delegate: MemberDelegate?
}- ๋ธ๋ฆฌ๊ฒ์ดํธ๋ weak ( โต ๊ฐํ ์ํ ์ฐธ์กฐ ๋ฐฉ์ง)
- ๋ธ๋ฆฌ๊ฒ์ดํธ๋ ์ต์ ๋ ( โต ์ผ์ ์ง์ํ์ง ์์ ์๋ ์์)
3. ์ด๋ฒคํธ ๋ฐ์ ์ Sender๋ ํ๋กํ ์ฝ์ ์ ์ํด ๋ ๋ฉ์๋๋ฅผ ํตํด ์ผ์ ์ง์
๋ฒํผ์ด ๋๋ฆฌ๋ฉด ์์ ์ ์ง์
Sender : ๋๋ฆฌ์์ผ~~ ์ด๋ฒคํธ(๋ฉค๋ฒ ์ถ๊ฐ, ๋ฉค๋ฒ ์ ๋) ๋ฐ์ํ์ด~!! (Receiver๋ 5๋ฒ์ ๊ตฌํํ๋๋ก ์ด๋ฒคํธ ์ฒ๋ฆฌํจ)
class DetailViewController: UIViewController {
ย ย func setupButtonAction() {
ย ย ย ย detailView.saveButton.addTarget(self, action: #selector(saveButtonTapped), for: .touchUpInside)
ย ย }
ย ย
ย ย @objc func saveButtonTapped() {
ย ย ย ย // MARK: ๋ฉค๋ฒ๊ฐ ์๋ ๊ฒฝ์ฐ(์๋ก์ด ๋ฉค๋ฒ ์ถ๊ฐ)
ย ย ย ย if member == nil {
ย ย ย ย ย ย let memberId = Int(detailView.idTextField.text!) ?? 0 // ๋ชจ๋ธ์ ์
๋ฐ์ดํธ๋ฅผ ํ ๋, ๋ช ๋ฒ ์งธ ๋ฉค๋ฒ์ธ์ง ์์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ๋ณ์๋ก ์ค์
ย ย ย ย ย ย let name = detailView.nameTextField.text ?? ""
ย ย ย ย ย ย let age = Int(detailView.ageTextField.text ?? "")
ย ย ย ย ย ย let phone = detailView.phoneTextField.text ?? ""
ย ย ย ย ย ย let address = detailView.addressTextField.text ?? ""
ย ย ย ย ย ย var newMember = Member(name: name, age: age, phone: phone, address: address) // ๋ด ๋ฐ์ดํฐ
ย ย ย ย ย ย
ย ย ย ย ย ย newMember.memberImage = detailView.mainImageView.image // ์ด๋ฏธ์ง๋ทฐ์ ์๋ ๊ฒ์ ๊ทธ๋๋ก ๋ค์ ๋ฉค๋ฒ์ ์ ์ฅ
ย ย ย ย ย ย
ย ย ย ย ย ย delegate?.addNewMember(newMember)
ย ย ย ย ย ย // MARK: ๋ฉค๋ฒ๊ฐ ์๋ ๊ฒฝ์ฐ(๊ธฐ์กด ๋ฉค๋ฒ์ ๋ด์ฉ์ ์
๋ฐ์ดํธ)
ย ย ย ย } else {
ย ย ย ย ย ย // ์ด๋ฏธ์ง๋ทฐ์ ์๋ ๊ฒ์ ๊ทธ๋๋ก ๋ค์ ๋ฉค๋ฒ์ ์ ์ฅ
ย ย ย ย ย ย member!.memberImage = detailView.mainImageView.image
ย ย ย ย ย ย let memberId = Int(detailView.idTextField.text!) ?? 0 // ๋ชจ๋ธ์ ์
๋ฐ์ดํธ๋ฅผ ํ ๋, ๋ช ๋ฒ ์งธ ๋ฉค๋ฒ์ธ์ง ์์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ๋ณ์๋ก ์ค์
ย ย ย ย ย ย member!.name = detailView.nameTextField.text ?? ""
ย ย ย ย ย ย member!.age = Int(detailView.ageTextField.text ?? "") ?? 0
ย ย ย ย ย ย member!.phone = detailView.phoneTextField.text ?? ""
ย ย ย ย ย ย member!.address = detailView.addressTextField.text ?? ""
ย ย ย ย ย ย
ย ย ย ย ย ย // ๋ทฐ์๋ ๋ฐ๋ ๋ฉค๋ฒ๋ฅผ ์ ๋ฌํด ๋ฐ์ (๋ทฐ์ปจํธ๋กค๋ฌ ==> ๋ทฐ)
ย ย ย ย ย ย detailView.member = member
ย ย ย ย ย ย
ย ย ย ย ย ย delegate?.update(index: memberId, member!)
ย ย ย ย }
ย ย }
}4. ์ผ์ ํ ์ปจํธ๋กค๋ฌ(Receiver)๋ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ฑํ
DetailVC(Sender) ๋์ ์ผ์ ํ๊ธฐ ์ํดVC(Receiver)๋DetailVC(Sender)์๊ฒ ์ ๊ทผํ ์ ์๋ ๊ณณ(ํ๋ฉด์ ํ์ด ์ผ์ด๋๋ ๊ณณ)์์DetailVC(Sender)์ ์ ๊ทผํด ๋ณธ์ธ์ ๋๋ฆฌ์๋ก ์ค์
ํ ์ด๋ธ๋ทฐ์์ add ๋ฒํผ์ ํตํ ํ๋ฉด ์ ํ(๋ฉค๋ฒ ์ถ๊ฐ)
final class ViewController: UIViewController {
ย ย lazy var plusButton: UIBarButtonItem = {
ย ย ย ย let button = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(plusButtonTapped))
ย ย ย ย return button
ย ย }()
ย ย
ย ย @objc func plusButtonTapped() {
ย ย ย ย let detailVC = DetailViewController()
ย ย ย ย detailVC.delegate = self
ย ย ย ย navigationController?.pushViewController(detailVC, animated: true)
ย ย }
}cell ํฐ์น๋ฅผ ํตํ ํ๋ฉด์ ํ(๋ฉค๋ฒ ์ ๋ณด ์ ๋ฐ์ดํธ)
extension ViewController: UITableViewDelegate {
ย ย func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
ย ย ย ย let detailVC = DetailViewController()
ย ย ย ย detailVC.delegate = self
ย ย ย ย let array = memberListManager.getMemberList()
ย ย ย ย detailVC.member = array[indexPath.row]
ย ย ย ย
ย ย ย ย navigationController?.pushViewController(detailVC, animated: true)
ย ย }
}- Receiver(๋๋ฆฌ์) : ๋ด๊ฐ Sender์ ๋๋ฆฌ์๊ฐ ๋๊ฒ ๋ค!!!(๋ด๊ฐ Sender ๋์ ์ผ์ ์ฒ๋ฆฌํ ๊ฒ!!)
5. Receiver(๋๋ฆฌ์)๋ ์ง์๋ฐ์ ๋์์ Sender ๋์ ์ฒ๋ฆฌ
๋ฐ์ดํฐ ์ถ๊ฐ/์ ๋ฐ์ดํธ ํ ํ๋ฉด ๋ฆฌ๋ก๋
Receiver : ๋ ๋ฉค๋ฒ ์ถ๊ฐ ๋์ ๋ ์ด๋ ๊ฒ ์ฒ๋ฆฌํ ๊ฑฐ์ผ ๋ฉค๋ฒ ์ ๋ณด๊ฐ ์ ๋ฐ์ดํธ๋์ ๋ ์๋ ๊ฒ ์ฒ๋ฆฌํ ๊ฑฐ์ผ
extension ViewController: MemberDelegate {
ย ย func addNewMember(_ member: Member) {
ย ย ย ย memberListManager.makeNewMember(member)
ย ย ย ย tableView.reloadData()
ย ย }
ย ย func update(index: Int, _ member: Member) {
ย ย ย ย memberListManager.updateMemberInfo(index: index, member)
ย ย ย ย tableView.reloadData()
ย ย }
}- ๋ธ๋ฆฌ๊ฒ์ดํธ ํ๋กํ ์ฝ ๋ฉ์๋๋ฅผ ์ ์
- ์ด ๋ฉ์๋๋ฅผ ํตํด
Sender์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ๊ณ ๋์ ์์ ์ํ