๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ฌ์ฏ๊ฐ์ง ๋ฐฉ๋ฒ์ ์์๋ณด์ !
1. instance property
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ ViewController ํ๋กํผํฐ์ ๊ฐ์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ property๋ฅผ ์ ์ธํ๊ณ , ๊ทธ property์ ๊ฐ์ UI์ ์ ์ฉํ๋ ์๋ฆฌ์ด๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ ViewController
propertyDataViewController.swift
var passingData = "" //์ฌ๊ธฐ์ ๋ฐ์ดํฐ ์ ๋ฌ๋ฐ์ ์์
@IBOutlet weak var setPassingData: UILabel! //์ฌ๊ธฐ์ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ ์ ์ฉ
override func viewDidLoad() {
super.viewDidLoad()
setPassingData.text = passingData
}
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ViewController
viewController.swift
@IBAction func sendPropertyData(_ sender: Any) {
let propertyVC = propertyDataViewController(nibName: "propertyDataViewController", bundle: nil)
propertyVC.passingData = "๋ฐ์ดํฐ ์ ๋ฌ ์๋ฃ !"
present(propertyVC, animated: true)
}
2. segue
์ฃผ๋ก ์ฌ๋ฌ๊ฐ์ ViewController๊ฐ ํ๋์ storyboard์ ์ ์ฉ๋ ๋ ์ฌ์ฉํ๋ค.
control + button ํ ์ํ๋ก ๋์ด๊ฐ ํ๋ฉด์ผ๋ก ๋๋๊ทธ ํด์ฃผ๋ฉด ๋๋ค. (๊ธฐ๋ณธ์ ์ผ๋ก show ์ฌ์ฉ)
์ด๋ ๊ฒ segue๋ฅผ ํตํด ๋ฒํผ์ ๋๋ฅด๋ฉด ํ๋ฉด ์ ํ์ ํ๋ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ๊ตฌํ ํ ์ ์๋ค! ์ด์ ๋ฐ์ดํฐ ์ ๋ฌ์ ํด๋ณด์
segue๋ ๊ตฌ๋ถ์ ์ํด์ indentifier๊ฐ ํ์ํ๋ค. ์ฐ๊ฒฐ๋ ํ์ดํ์ identifier๋ฅผ String์ผ๋ก ์ง์ ํ ์ ์๋ค.
๋์ผํ ์คํ ๋ฆฌ๋ณด๋์์ ์ฌ๋ฌ VC๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ VC๋ง๋ค class๋ฅผ ์ฐ๊ฒฐํด์ฃผ์ด์ผ ํ๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ ViewController
์ ๋ฌ๋ฐ์ VC๋ 1๋ฒ๊ณผ ๋น์ทํ๋ค.
segueDataViewController.swift
var passingData = ""
@IBOutlet weak var dataLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
dataLabel.text = passingData
}
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ViewController
viewController.swift
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "passingSegueData" {
if let segueVC = segue.destination as? segueDataViewController{
segueVC.passingData = "segue๋ก ๋ฐ์ดํฐ ์ ๋ฌ ์๋ฃ !"
}
}
}
์ฌ์ฉํ segue์ identifier๋ฅผ ์ฒดํฌํ๊ณ , ์ด๋ํ VC์ class๋ก ํ์ ์บ์คํ (as?)์ด ๊ฐ๋ฅํ์ง ํ์ธํด์ผํ๋ค.
๊ฐ๋ฅํ๋ฉด, ์์๋ณ์์ ํ ๋น๋ class์ ์๋ ํ๋กํผํฐ์ ์ ๊ทผํ ์ ์๋ค.
3. Instance
instance๋ฅผ ํต์งธ๋ก ๋๊ฒจ๋ฐ์ ์ง์ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์๋ค.
์ด๋ฒ ์์๋ VC๋ฅผ ํตํด mainVC์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ฌ๊ฒ์ด๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ ViewController
ViewController.swift
@IBOutlet weak var dataLabel: UILabel!
@IBAction func moveInstanctVC(_ sender: Any) { //ํ๋ฉด ์ ํ์ ์ํ ์ฝ๋ (์ค์X)
let instanceVC = instanceDataViewController(nibName: "instanceDataViewController", bundle: nil)
instanceVC.mainVC = self
present(instanceVC, animated: true)
}
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ViewController
instanceDataViewController.swift
var mainVC: ViewController?
@IBAction func sendInstanceData(_ sender: Any) {
mainVC?.dataLabel.text = "instance ๋ฐ์ดํฐ ์ ๋ฌ ์๋ฃ !"
dismiss(animated: true) //๋ฒํผ ํด๋ฆญ ํ ํ๋ฉด ๋ซ๊ธฐ
}
์ ๋ฌ๋ฐ์ class ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์ ์ธํด๋๊ณ ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋๋ค.
4. delegate pattern
์ฝ๊ฒ ์ ์ํ๋ฉด OOP์์ ํ๋์ ๊ฐ์ฒด๊ฐ ์ฒ๋ฆฌํด์ผ ํ๋ ์ผ์ ์ผ๋ถ๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋๊ธฐ๋ ๊ฒ์ด๋ค.
Aํ๋ฉด์ด ๋จผ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ์ ์๋ ์ํ์์ Bํ๋ฉด์ ๋์ธ๋ Bํ๋ฉด->Aํ๋ฉด์ผ๋ก ๋ฐ์ดํฐ ์ ๋ฌ ์ ์ฌ์ฉํ ์ ์๋ค!
์ฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ VC๋ Bํ๋ฉด, ๋ฐ์ดํฐ๋ฅผ ๋ฐ์VC๋ Aํ๋ฉด์ด ๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ViewController
์์์ protocol์ ํตํด์ ํ๋ค. protocol์ ์์ํ ๋ด์ฉ์ ์๋ ค์ฃผ๊ณ , ์ธ๋ถ์ ์ธ ๋ด์ฉ์ ์ฑํํ ๊ฐ์ฒด์์ ์์ฑํ๋ค.
protocol์ weak๋ก ์ ์ธํ๋ ค๋ฉด ํด๋น protocol์ด AnyObject๋ฅผ ์์ ๋ฐ์์ผ ํ๋ค (์ด์ ๋ ๋ฐ์)
delegateDataViewController.swift
protocol delegateDateViewControllerDelegate: AnyObject {
func delegatePassingData(str: String)
}
delegateํ๋กํผํฐ๋ฅผ weak์ผ๋ก ์ ์ธํ๋ค. ์ด์ ๋ delegate๊ฐ retain์ด ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ง๊ธฐ ์ํด์์ด๋ค.
๋ฒํผ์ ๋๋ฅด๋ฉด str๋ก ํด๋น ๋ฌธ์์ด์ ๋๊ฒจ์ค๋ค.
weak var delegate: delegateDateViewControllerDelegate?
@IBAction func passingData(_ sender: Any) {
delegate?.delegatePassingData(str: "delegate ๋ฐ์ดํฐ ์ ๋ฌ ์๋ฃ !")
dismiss(animated: true)
}
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ ViewController
์ ๋ฌ๋ฐ์ VC๋ protocol์ ์ฑํํด์ผํ๋ค. class์์ ์ฑํํด๋๋๊ณ extensionํ ์๋ ์๋ค.
ํ ์ผ์ ์์๋ฐ์์ ์ฒ๋ฆฌ ํด์ฃผ๋ ์ฝ๋๋ฅผ func๋ด์ ์์ฑํ๋ค.
ViewController.swift
extension ViewController: delegateDateViewControllerDelegate {
func delegatePassingData(str: String) {
dataLabel.text = str
}
}
ํ๋ฉด์ ์ ํํ ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ VC์๊ฒ '๋ด๊ฐ ์์๋ฐ์๋ค!' ๋ผ๋ ๊ฒ์ ์๋ ค์ค์ผ ํ๋ค.
delegateVC.delegate = self ์ฝ๋๊ฐ ๊ทธ๋ฐ ์ญํ ์ ํ๋ค. delegateํ๋กํผํฐ๋ฅผ ์ฌ๊ธฐ์ ์ฒ๋ฆฌํ๋ค๋ ์๋ฏธ๋ก ํด์ํ๋ฉด ๋ ๊ฒ๊ฐ๋ค.
@IBAction func moveDelegateVC(_ sender: Any) {
let delegateVC = delegateDataViewController(nibName: "delegateDataViewController", bundle: nil)
delegateVC.delegate = self
self.present(delegateVC, animated: true)
}
์ฌ๊ธฐ์ ํ๊ฐ์ง ์ค์ํ์ ์ ์์ฝ๋์ self๋ viewController class๊ฐ ์๋๋ผ๋ ์ ์ด๋ค !
delegateVC์ delegateํ๋กํผํฐ๊ฐ protocol์ด๋ฏ๋ก self๋ extensionํ viewController์ ๋ด์ฉ๋ง ๋ด๊ณ ์๋ค. ๋ช ์ฌํ ๊ฒ โ๏ธ
5. closure
์ต๋ช ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ด๋ค.
์ฌ๊ธฐ์ ํน์ง์ ์ ์ธ๋ถ์ ๊ตฌํ๋ถ๊ฐ ๋ค๋ฅธ๊ณณ์ ์์นํ๋ค๋ ๊ฒ์ด๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ViewController
closure๊ฐ ํด๋์ค ๋ด์ ํ๋กํผํฐ์ด๋ฏ๋ก ์ต์ ๋๋ก ์์ฑํด์ผ ํ๋ค. passingData ๋ด์ closure์ ์ ์ธ๋ถ๋ฅผ ์์ฑํ๋ค.
closureDataViewController.swift
var closure: ((String)->Void)?
@IBAction func passingData(_ sender: Any) {
closure?("closure ๋ฐ์ดํฐ ์ ๋ฌ ์๋ฃ !")
self.dismiss(animated: true)
}
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ ViewController
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ VC์์ ๊ตฌํ๋ถ๋ฅผ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ VC์๊ฒ ๋๊ฒจ์ค๋ค.
viewController.swift
@IBAction func moveClosureVC(_ sender: Any) {
let closureVC = closureDataViewController(nibName: "closureDataViewController", bundle: nil)
closureVC.closure = { str in
self.dataLabel.text = str
}
present(closureVC, animated: true)
}
6. Notification
notification์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ์์๋ ๊ฐ์ฒด ๋ชจ๋์๊ฒ ์ ํธ๋ฅผ ๋ณด๋ด๊ณ , ๊ฐ์ ์ ํธ Name์ ๊ฐ์ง ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์์ ํฉ๋๋ค.
๊ทธ๋์ Name์ด ๋งค์ฐ ์ค์ํฉ๋๋ค !!
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ViewController
NotificationCenter์ ์ฑ๊ธํค์ด๊ธฐ ๋๋ฌธ์ ์ด๋์์๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
post๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ํ๋ ๋ถ๋ถ์ ๋๋ค.
ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐจ๋ก๋๋ก ํด์ํ๋ฉด Notification.Name์ด "SendNoti"์ธ ๊ฐ์ฒด์๊ฒ userInfo ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ๋๋ค.
notificationDataViewController.swift
@IBAction func passingData(_ sender: Any) {
let noti = Notification.Name("sendNoti")
NotificationCenter.default.post(name: noti, object: nil, userInfo: ["str" : "notification ๋ฐ์ดํฐ ์ ๋ฌ ์๋ฃ !"])
self.dismiss(animated: true)
}
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ ViewController
addObserver๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ๊ธฐ ์ํด์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ Notification.Name์ด ์ผ์นํด์ผํ๋ค.
ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐจ๋ก๋๋ก ํด์ํ๋ฉด self๋ Observer๋ฅผ ์ถ๊ฐํ ๊ฐ์ฒด์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก self๋ฅผ ์ฌ์ฉํฉ๋๋ค.
selector๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์คํํ ํจ์๋ฅผ ์์ฑํฉ๋๋ค. name์ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ์ ํธ๊ฐ ์์ผ๋ฉด ๊ฐ์งํฉ๋๋ค.
selector์์ ์ฌ์ฉํ ํจ์๋ @objc๋ก ์ ์ธํด์ผ ํ๋ค.
@objc๋ objective-c์์ ์ฌ์ฉํ๋ค๋ ์๋ฏธ๋ก, NotificationCenter: NSObject ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๋ค.
viewController.swift
// ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ๋ถ๋ถ
override func viewDidLoad() {
super.viewDidLoad()
let noti = Notification.Name("sendNoti")
NotificationCenter.default.addObserver(self, selector: #selector(showNotiData), name: noti, object: nil)
}
// ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ ์ฉ์ํค๋ ๋ถ๋ถ
@objc func showNotiData(notification : Notification){
if let str = notification.userInfo?["str"] as? String{
self.dataLabel.text = str
}
}
// ํ๋ฉด ์ ํ ๋ถ๋ถ (notification๊ณผ ์๊ด์๋ ๋ถ๋ถ์)
@IBAction func moveNotificationVC(_ sender: Any) {
let notiVC = notificationDataViewController(nibName: "notificationDataViewController", bundle: nil)
present(notiVC, animated: true)
}
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ๋ค์ํ๊ณ , ์ฌ์ด ๋ฐฉ๋ฒ ์ด๋ ค์ด ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ง๋ง ์ด๋ ํ๋๋ง ๊ณจ๋ผ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๋์ง ํ์ง ์๋ค.
์ํฉ์ ๋ง๋ ์ ์ ํ ์ ๋ฌ๋ฐฉ์์ ์ฌ์ฉํ์ ๐
์ฝ๋ ์ ์ฒด๋ณด๊ธฐ
https://github.com/sladuf/UIKit_practice/tree/main/passingData
'๐ฑ iOS > UIKit' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[UIKit] TableView Multiple Cell, multi type json data parsing (0) | 2023.06.27 |
---|---|
[UIKit] CustomDatePicker ๋ง๋ค๊ธฐ (3/3) (0) | 2023.04.03 |
[UIKit] toast message ๋ง๋ค๊ธฐ (0) | 2023.02.16 |
[UIKit] CustomDatePicker ๋ง๋ค๊ธฐ (2/3) (0) | 2023.01.08 |
[UIKit] CustomDatePicker ๋ง๋ค๊ธฐ (1/3) (0) | 2023.01.08 |