(iOS) ๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด (Delegate Pattern , tableView , TextField, ํ๋ฉด๊ฐ ๋ฐ์ดํฐ ์ ๋ฌ)
- -
Delegate Pattern
iOS ๊ฐ๋ฐ ํจํด์ค ๊ฐ์ฅ ์ค์ํ ํจํด์ด๋ค. Apple framework๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ฐ๋์ ์์์ผํ ํจํด์ด๋ค.
- ์ด๋ค ๊ฐ์ฒด์, ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ ๋์ ์ํํ ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ฐ์ฒด๊ฐ ํ์ํ๋ค.
- ์๋ฅผ๋ค๋ฉด, ์ํ์ ํ์ํ๋ TableView๋ฅผ ํฐ์นํ๋ฉด, ์์ธ ํ์ด์ง๋ก ์ด๋ํ๋ ๊ธฐ๋ฅ์ด ์๋ค๊ณ ํ๋ค. ์ด๋, ์ฌ์ฉ์๊ฐ TableView๋ฅผ ์ ํํ์๋, TableView๊ฐ์ฒด๋ ์ด๋ค ๊ธฐ๋ฅ์ ์คํํด์ผ ํ ์ง ๋ชจ๋ฅธ๋ค. ๋ฐ๋ผ์ ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ฐ์ฒด๊ฐ ์ด(์์ธ ํ์ด์ง๋ก ์ด๋ํ๋ ๊ธฐ๋ฅ)๋ฅผ ์ํํ๋ค.
- ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ฌ์ฉํ๋ TableView ๊ฐ์ฒด๋
...dataSource
ํน์...delegate
๋ผ๋ ์ ๋ฏธ์ด๋ฅผ ๊ฐ์ง๋ค. - ์ฌ์ฉ์๊ฐ TableView๋ฅผ ํฐ์นํ๊ฒ ๋๋ฉด, TableView๋ ์ง์ ๊ธฐ๋ฅ์ ์ํํ์ง ๋ชปํ๋ฏ๋ก, ๋๋ฆฌ์์ ํจ์๋ฅผ ํธ์ถํ๊ณ , ์ด๋ ๋๋ฆฌ์(๋ธ๋ฆฌ๊ฒ์ดํธ ๊ฐ์ฒด)๊ฐ ๋์ ๊ธฐ๋ฅ์ ์ํํ๋ค.
- ํน์ ์ด๋ฒคํธ ๋ ํธ์ถ๋๋ ๋ฉ์๋๋ ํ๋กํ ์ฝ์ ์ ์ธ๋์ด์์ด์ผ ํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋น์ฐํ ํ๋กํ ์ฝ์ ์ ์ธ๋์ด์๋๊ฒ๊ณผ ์ผ์นํ๊ฒ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผํ๋ค.
(ํ ์ด๋ธ๋ทฐ๊ฐ์ ๊ฒฝ์ฐ์๋, ๋ณดํต ์์ ์ ํฌํจํ๊ณ ์๋ ๋ทฐ์ปจํธ๋กค๋ฌ๋ฅผ ๋๋ฆฌ์๋ก ์ง์ ํ๋ค.)
๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด์ ์ฌ์ฉํ๋ ์ด์
iOS์์ ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ๋ธ๋ฆฌ๊ฒ์ด์ ์ ๊ตฌํํ๋ ๊ฒ์ ํด๋์ค๊ฐ ๋จ์ผ ์์๋ง์ ์ง์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ํ๋์ ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์๋ฐ๊ณ ๋๋ฉด ๋๋ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์๋ฐ์ ์ ์์ผ๋ฏ๋ก ๊ธฐ๋ฅ์ ๋ง๋ถ์ด๊ธฐ์๋ ์ ํ์ ์ด๋ค. ์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ๊ตฌํ ๊ฐ์์ ์ ํ์ด ์๋ ํ๋กํ ์ฝ์ ์ด์ฉํ์ฌ ํ์ํ ๊ธฐ๋ฅ ๋จ์๋ณ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
= ๊ฐ๋ฐ์ ์ ์ฐ์ฑ์ด ์ฆ๊ฐํ๋ค.
๋ธ๋ฆฌ๊ฒ์ดํธ ๊ตฌํ ์์
ios์์ ๋ธ๋ฆฌ๊ฒ์ดํธ์ ์ญํ ์ ํฌ๊ฒ ๋๊ฐ์ง์ด๋ค.
- ๋ฐ์ดํฐ ๊ณต๊ธ (์ด๋ฌํ ๊ฒฝ์ฐ์๋
...DataSource
๋ผ๋ ์ ๋ฏธ์ด๋ฅผ ๊ฐ์ง๋ค.) - ์ด๋ฒคํธ ์ฒ๋ฆฌ (
...Delegate
์ ๋ฏธ์ด๋ฅผ ๊ฐ์ง๋ค.)
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์ปจํธ๋กค์์ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ํ์๋ก ํ๋๊ฒ์ด ์๋๋ค. ์๋ฅผ๋ค์ด TextField
์์๋ ๋ฐ์ดํฐ๋ฅผ ๊ณต๊ธํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์, ...DataSource
๋ ํ์ํ์ง ์๋ค.
- ์ด๋ค ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋, Delegate๊ฐ ํ์ํ ๊ฐ์ฒด์ธ์ง ๋จผ์ ๊ฐ๋ฐ์ ๋ฌธ์์์ ํ์ธํ๋ค.
- ํ์ํ๋ค๋ฉด, ๊ตฌํํ๊ณ ์ ํ๋ ๋ฉ์๋์ ํ๋กํ ์ฝ์ ํ์ธํ๋ค. (์ด๋ ๊ฐ๋ฐ์ ๋ฌธ์์
required
๋ผ๊ณ ํ์๋ ๋ฉ์๋๋ ๋ฐ๋์ ๊ตฌํํด์ผํ๋ ๋ฉ์๋์ด๋ค.) ๊ตฌํํ๊ณ ์ ํ๋ ๊ฐ์ฒด
-Delegate ๊ฐ์ฒด
๋ฅผ ์ฐ๊ฒฐํด์ค๋ค.Delegate ๊ฐ์ฒด
์์ ํ๋กํ ์ฝ์ ๊ตฌํํด์ค๋ค.
TableView Delegate Pattern (์ฝ๋ ๊ตฌํ)
import UIKit
class ViewController: UIViewController {
// MARK: ํ๋กํผํฐ
let myTableView = UITableView()
let items = ["swift", "iOS", "TableView"]
// MARK: ViewController override method
override func viewDidLoad() {
super.viewDidLoad()
self.myTableView.dataSource = self
self.myTableView.delegate = self
self.myTableView.register(UITableViewCell.self,
forCellReuseIdentifier: "cell")
self.view.addSubview(self.myTableView)
self.myTableView.translatesAutoresizingMaskIntoConstraints = false
self.view.addConstraint(NSLayoutConstraint(item: self.myTableView,
attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top,
multiplier: 1.0, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: self.myTableView,
attribute: .bottom, relatedBy: .equal, toItem: self.view,
attribute: .bottom, multiplier: 1.0, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: self.myTableView,
attribute: .leading, relatedBy: .equal, toItem: self.view,
attribute: .leading, multiplier: 1.0, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: self.myTableView,
attribute: .trailing, relatedBy: .equal, toItem: self.view,
attribute: .trailing, multiplier: 1.0, constant: 0))
}
}
// MARK: UITableViewDelegate
extension ViewController : UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print(items[indexPath.row])
}
}
// MARK: UITableViewDataSource
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView,
numberOfRowsInSection section: Int) -> Int {
return self.items.count
}
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = items[indexPath.row]
return cell
}
}
Text Field Delegate Pattern
- ๋ธ๋ฆฌ๊ฒ์ดํธ ์ง์ ์ ๋ณดํต viewDidLoad() ์์์ ํ๋ค.
UITextFieldDelegate
์๋ ํ์ ๋ฉ์๋๊ฐ ์๋ค.- ๋จ์ํ ์ ๋ ฅ๊ฐ์ ๋ฐ๋ ๊ฒ์ ๋ธ๋ฆฌ๊ฒ์ดํธ๊ฐ ํ์์์ง๋ง, ํน์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ํ์์ ์ด๋ค.
- ํน์ ๊ธฐ๋ฅ์ ์ซ์๋ง ์ ๋ ฅ๊ฐ์ผ๋ก ๋ฐ๊ธฐ, ์ ๋ ฅ ๋ฌธ์์ ๊ฐ์๋ฅผ ์ ํํ๊ธฐ, ๋ฑ๋ฑ์ ์ ์ด๊ธฐ๋ฅ์ ๋งํ๋ค.
import UIKit
class TextFieldViewController : UIViewController{
@IBOutlet weak var inputField : UITextField!
override func viewDidLoad(){
super.viewDidLoad()
inputField.delegate = self
}
}
extension TextFieldViewController: UITextFieldDelegate {
}
Protocol Extension
๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ด์ฉํด์ ์ด์ ํ๋ฉด์ผ๋ก ๊ฐ ์ ๋ฌํ๊ธฐ
ComposeDelegate.swift ( ํ๋กํ ์ฝ ์ ์ธ ํ์ผ )
import UIKit
protocol ComposeDelegate {
func composer(_ vc: UIViewController, didInput value : String?)
func composerDidCancel(_ vc: UIViewController)
}
- delegate ์์ฑ์ ๋๋ถ๋ถ ์ต์ ๋ ํ๋กํ ์ฝ ํ์์ผ๋ก ์ ์ธํ๋ค.
CustomDelegateViewController.swift (์ด์ ํ๋ฉด)
import UIKit
class CustomDelegateViewController: UIViewController {
@IBOutlet weak var valueLabel: UILabel!
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination.children.first as? ComposeViewController {
vc.delegate = self
}
}
@objc func presentComposeVC() {
performSegue(withIdentifier: "ComposeSegue", sender: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(presentComposeVC))
}
}
extension CustomDelegateViewController : ComposeDelegate {
func composer(_ vc: UIViewController, didInput Value: String?) {
valueLabel.text = Value
}
func composerDidCancel(_ vc: UIViewController) {
valueLabel.text = "Cancel"
}
}
ComposeViewController.swift (๋ค์ํ๋ฉด)
import UIKit
class ComposeViewController: UIViewController {
var delegate : ComposeDelegate?
@IBOutlet weak var inputField: UITextField!
@IBAction func performCancel(_ sender: Any) {
delegate?.composerDidCancel(self)
dismiss(animated: true, completion: nil)
}
@IBAction func performDone(_ sender: Any) {
delegate?.composer(self, didInput: inputField.text)
dismiss(animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
self.inputField.delegate = self
if #available(iOS 13.0, *) {
isModalInPresentation = true
}
}
}
extension ComposeViewController : UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
delegate?.composer(self, didInput: self.inputField.text)
dismiss(animated: true, completion: nil)
return true
}
}
'๐ฑ iOS > -- UIKit' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
(iOS) UIControl - Picker View (0) | 2021.06.02 |
---|---|
(iOS) UIControl - Button (0) | 2021.06.02 |
(iOS) UIControl ๊ณตํต ๊ฐ๋ - Target Action , selector (0) | 2021.06.01 |
(iOS) ํ๋ฉด ์ ํ ๋ฐฉ์ (present, pushViewController, Segue) (0) | 2021.05.14 |
[IOS] X Code์์์ UI ๊ตฌ์ฑ ๋ฐฉ๋ฒ, @IBOutlet ๊ณผ @IBAction , ์ปจํธ๋กค ์ด๋ฒคํธ์ ์ข ๋ฅ (0) | 2021.04.20 |
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค