[iOS, Swift] ContainerView ๋ง๋ค๊ธฐ, View๊ฐ ๋ฐ์ดํฐ ์ ๋ฌํ๊ธฐ - 1. prepare ๋ฉ์๋, 2.Children, parent ํ๋กํผํฐ ์ฌ์ฉ
์ปจํ ์ด๋ ๋ทฐ ์ปจํธ๋กค๋ฌ(Container View Controller)์ ๋ํด ์์๋ณด์
์ฝํ ์ธ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ ์ด๋ฏธ์ง๋ ํ ์คํธ, HTML ํ์ด์ง ๋ฑ ์ฑ์ ํ๋ฉด์ ํํํ ์ฝํ ์ธ ๋ฅผ ๊ด๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ์ ๋๋ค.
์ด๋ฅผ ์ํด ์ฝํ ์ธ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ ํ๋ฉด ์ ์ฒด ์ฌ์ด์ฆ์ ๋ฃจํธ ๋ทฐ๋ฅผ ๋ด์ฅํ๊ณ ์์ผ๋ฉฐ, ์ด ๋ทฐ ์์ ๊ฐ์ข ์ฝํ ์ธ ๋ฅผ ์น์ด ํ๋ฉด์ ์ถ๋ ฅํฉ๋๋ค.
iOS๋ ํ๋ฉด์ ์ ์ฝ์ผ๋ก ์ธํด ๊ธฐ๋ณธ์ ์ผ๋ก ํ ํ๋ฉด์ ํ๋์ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ง ํ์ํ ์ ์๊ธฐ ๋๋ฌธ์, ๋๋จธ์ง ๋ทฐ ์ปจํธ๋กค๋ฌ์ ์ ๊ทผํ๋ ํจ์จ์ ์ธ ์๋จ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ด๋ฅผ ์ํด ์ปจํ ์ด๋ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ ํ๋์ ๋ทฐ ์ปจํธ๋กค๋ฌ์์ ๋ค๋ฅธ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ก ์ฝ๊ณ ์์ฐ์ค๋ฝ๊ฒ ์ด์ด์ง๋๋ก ๋ค์ํ ์๋จ์ ์ ๊ณตํฉ๋๋ค.
Apple Developer Documentation
developer.apple.com
๐ฅ 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)
}
}
[๊ฒฐ๊ณผ ํ๋ฉด]