์ปจํ ์ด๋ ๋ทฐ ์ปจํธ๋กค๋ฌ(Container View Controller)์ ๋ํด ์์๋ณด์
์ฝํ ์ธ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ ์ด๋ฏธ์ง๋ ํ ์คํธ, HTML ํ์ด์ง ๋ฑ ์ฑ์ ํ๋ฉด์ ํํํ ์ฝํ ์ธ ๋ฅผ ๊ด๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ์ ๋๋ค.
์ด๋ฅผ ์ํด ์ฝํ ์ธ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ ํ๋ฉด ์ ์ฒด ์ฌ์ด์ฆ์ ๋ฃจํธ ๋ทฐ๋ฅผ ๋ด์ฅํ๊ณ ์์ผ๋ฉฐ, ์ด ๋ทฐ ์์ ๊ฐ์ข ์ฝํ ์ธ ๋ฅผ ์น์ด ํ๋ฉด์ ์ถ๋ ฅํฉ๋๋ค.
iOS๋ ํ๋ฉด์ ์ ์ฝ์ผ๋ก ์ธํด ๊ธฐ๋ณธ์ ์ผ๋ก ํ ํ๋ฉด์ ํ๋์ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ง ํ์ํ ์ ์๊ธฐ ๋๋ฌธ์, ๋๋จธ์ง ๋ทฐ ์ปจํธ๋กค๋ฌ์ ์ ๊ทผํ๋ ํจ์จ์ ์ธ ์๋จ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ด๋ฅผ ์ํด ์ปจํ ์ด๋ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ ํ๋์ ๋ทฐ ์ปจํธ๋กค๋ฌ์์ ๋ค๋ฅธ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ก ์ฝ๊ณ ์์ฐ์ค๋ฝ๊ฒ ์ด์ด์ง๋๋ก ๋ค์ํ ์๋จ์ ์ ๊ณตํฉ๋๋ค.
๐ฅ Container View ๋ง๋ค๊ธฐ
Container View๋ฅผ ๋ง๋๋ ๋ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.๐
Container View Object๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
์ถ๊ฐํ๋ฉด, ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์๋์ผ๋ก ์์ ๋ทฐ๊ฐ ์๊น๋๋ค.
์ถ๊ฐํ Container View๋ฅผ ์ปจํธ๋กคํ VC(ContainerViewController.swift)๋ฅผ ์์ฑ ํ ์ฐ๊ฒฐํด์ค๋๋ค.
๋ฐฑ๊ทธ๋ผ์ด๋ ์ปฌ๋ฌ๋ฅผ ๋ฐ๊ฟ์ ํ ์คํธํด๋ณธ ํ๋ฉด์ ๋๋ค. ์ ์ฐ๊ฒฐ๋์๋ค์.๐๐ป
๐ฅ Container View ๋ฐ์ดํฐ ์ ๋ฌํ๊ธฐ - 1. prepare ๋ฉ์๋ ์ฌ์ฉ
1. Segue idenifier ์ค์
segue๋ ๋ ๋ทฐ์ฌ์ด์ ๊ด๊ณ๋ฅผ ์๋ฏธํฉ๋๋ค. Storyboar์์ ์ฐ๊ฒฐํ Segue๋ฅผ ์ ํํ์ฌ Identifier ๊ฐ์ ์ค์ ํฉ๋๋ค.
2. prepare ๋ฉ์๋ ์ ์
segue๋ฅผ ํตํ ํ๋ฉด ์ ํ์ด ์ผ์ด๋๊ธฐ ์ง์ , ์์คํ ์ ์ํด ์๋์ผ๋ก prepare(for: sender) ๋ฉ์๋๊ฐ ํธ์ถ์ด ๋ฉ๋๋ค.
(์ถ๋ฐ์ง์ธ source / ๋์ฐฉ์ง์ธ destination)
prepare ๋ฉ์๋์ storyboard์์ ์ค์ ํ ๋์ผํ segue identifier๋ฅผ ์ ๋ ฅํ์ฌ ์ฐ๊ฒฐํด์ค๋๋ค.
์ฐ๊ฒฐ ํ sugue์ destination ํ๋กํผํฐ์ ContainerVC ์ฐ๊ฒฐ ํ ๋ฐ์ดํฐ๋ฅผ ์ ์กํฉ๋๋ค.
// AViewController - ๋ถ๋ชจ View
Class AViewController : UIViewController {
//ContainerView ์ ViewDidLoad๋ณด๋ค ๋จผ์ ์คํ
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
//storyboard์์ ์ค์ ํ identifier์ ๋์ผํ ์ด๋ฆ
if segue.identifier == "embedContainer" {
let containerVC = segue.destination as! ContainerViewController
containerVC.testStr = "Value from Prepare: \(containerValue)"
}
}
}
ViewdidLoad์์ ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฟ๋ ค์ฃผ์ด ํ๋ฉด์ ๋ณด์ฌ์ค๋๋ค.
//ContainerViewController - ์์ View
Class ContainerViewController : UIViewController {
var testStr: String?
override func viewDidLoad() {
super.viewDidLoad()
self.testLabel.text = testStr
}
}
[๊ฒฐ๊ณผ ํ๋ฉด]
๐ฅ Container View ๋ฐ์ดํฐ ์ ๋ฌํ๊ธฐ - 2. children, parent ํ๋กํผํฐ ์ฌ์ฉ
์ด ๋ฐฉ๋ฒ์ ๋ถ๋ชจ View์ ์์ View ์ฌ์ด์ ๋ฐ์ดํฐ ์ ์ก ๋ฐฉ๋ฒ์ ๋๋ค.
Container View๋ฅผ ์์ View๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์ฌ์ฉํ๋ ํ๋กํผํฐ๋ง ๋ค๋ฅด๊ณ process๋ ๋์ผํฉ๋๋ค.
[process]
1. ๋ฐ์ดํฐ ์ ์ก ๋ฉ์๋ ์์ฑ
2. children, parent ํ๋กํผํฐ๋ก ์ฐ๊ฒฐํ์ฌ ๋ฐ์ดํฐ ์ ์ก ๋ฉ์๋ ์ฌ์ฉ
1) ๋ถ๋ชจ View -> ์์ View
To send data from AViewController to ContainerViewController
: children ํ๋กํผํฐ ์ฌ์ฉ
var children: [UIViewController] { get }
๋ถ๋ชจ๋ทฐ์ ๋ฒํผ ํด๋ฆญ์ ๋ณ๊ฒฝ๋๋ ๊ฐ์ ์์๋ทฐ์ ์ ๋ฌํ๊ฒ ํ ์คํธํด๋ณด์์ด์.
๋จผ์ , ์์๋ทฐ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํฉ๋๋ค.
//ContainerViewController - ์์ View
Class ContainerViewController : UIViewController {
@IBOutlet weak var testLabel: UILabel!
func ChangeLabel(labelToChange : Int){
self.testLabel.text = "Value from Parent : \(labelToChange)"
}
}
๋ถ๋ชจ๋ทฐ์์ button ์ก์ ์์ children ํ๋กํผํฐ๋ฅผ ํตํด ์ ๊ทผํ์ฌ ์์๋ทฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ๋๋ค.
// AViewController - ๋ถ๋ชจ View
Class AViewController : UIViewController {
var containerValue: Int = 1
@IBAction func changeContainerValue(_ sender: Any) {
containerValue += 1
// childView๋ก ๊ฐ ๋ณด๋
let CVC = children.last as! ContainerViewController
CVC.ChangeLabel(labelToChange: containerValue)
}
}
[๊ฒฐ๊ณผ ํ๋ฉด]
2) ์์ View -> ๋ถ๋ชจ View
To send data from ContainerViewController -> AViewController
: parent ํ๋กํผํฐ ์ฌ์ฉ
weak var parent: UIViewController? { get }
๋ง์ฐฌ๊ฐ์ง๋ก ๋จผ์ , ๋ถ๋ชจ๋ทฐ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ๋ฉ์๋(dataFromContainer)๋ฅผ ๊ตฌํํฉ๋๋ค.
Class AViewController : UIViewController {
@IBOutlet weak var messageFromBVCLabel: UILabel!
// childView์์ ๊ฐ ๋ฐ์์ด
func dataFromContainer(containerData : String){
messageFromBVCLabel.text = "Value From Children : \(containerData)"
}
}
์์๋ทฐ์์ parent ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ๋ทฐ์ ์ ๊ทผํฉ๋๋ค.
์ ๊ทผ ํ, ๊ตฌํํ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ก ์ ๋ฌ๋ฉ๋๋ค.
Class ContainerViewController : UIViewController {
var valueFromParent: Int = 1
// parentVC์ ๊ฐ ์ ๋ฌ
@IBAction func sendDataToVc(_ sender: Any) {
valueFromParent += 1
let Avc = parent as! AViewController
let myString = "\(valueFromParent)"
Avc.dataFromContainer(containerData: myString)
}
}
[๊ฒฐ๊ณผ ํ๋ฉด]