UIViewController, UITableViewCell, UICollectionViewCell, UICollectionReusableView ๋ฑ์
์์ ๋ฐ๋ subclass ํ์ผ์ ์์ฑํ ๋ xib๋ฅผ ํจ๊ป ๋ง๋ค ์ ์์ง๋ง
์์ฝ๊ฒ๋ UIView๋ ํ์ผ ์์ฑ์ ํจ๊ป xib๋ฅผ ๋ง๋ค์ด ์ค ์ ์์ต๋๋น
์ฐ์ ์ UIView์ Subclass์ธ CommonTextField๋ฅผ ์์ฑํด ์ฃผ๊ฒ ์ต๋๋ค
์ ํ์ผ์ ์ถ๊ฐํ๊ณ Class ๋ช ์ ์ ๋ ฅํ ํ
Subclass๋ UIView๋ก ์์ ๋ฐ์ผ๋ฉด ๋ฉ๋๋ค
Next๋ฅผ ๋๋ฌ์ ์งํํด ์ค๋๋ค.
์ด์ xib ํ์ผ์ ์์ฑํด ์ค๋๋ค
์๋ก์ด ํ์ผ์ ์ถ๊ฐํ๊ณ User Interface ์น์ ์์ ๋ณด์ด๋ View๋ฅผ ์ ํํด ์ฃผ๋ฉด
xib ํ์ผ์ ์ถ๊ฐํ ์ ์์ต๋๋ค
์ ๋ ์ด์ ์ ์์ฑํ UIView ๋ฅผ ์์๋ฐ์
CommonTextField์ ๋์ผํ๊ฒ
CommonTextField.xib๋ก ์ง์ ํด ์ฃผ์์ต๋๋ค.
๋๋ถ๋ถ ์ปค์คํ ๋ทฐ๋ VC์์ ์ผ๋ถ๋ถ์ ๋น๋นํ๊ฒ ๋๊ธฐ ๋๋ฌธ์
xib์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณด์ด๋ view์ ์ฌ์ด์ฆ๋ฅผ ์์ ์์ฌ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋๋ก ๋ง๋ค์ด ์ฃผ๊ฒ ์ต๋๋ค
Attributes Inspector์์ Size > Freeform์ ๋๋ฌ ์ค๋๋ค
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ์ํ๋ ์ฌ์ด์ฆ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅํฉ๋๋ค
๋ชจ์๋ฆฌ๋ ๊ฐ์ฅ์๋ฆฌ๋ฅผ ์ก๊ณ ์กฐ์ ํด ์ฃผ์ธ์!
๋ฐ๋์ File's Owner๋ฅผ ํ๋ฒ ํด๋ฆญํด ์ฃผ์๊ณ
์ด์ ์ด๋ฏธ์ง์ ๋์ ์๋ Help inspector๊ฐ ์๋๋ผ(ใ ใ )
Identity inspector(๋ค๋ฒ์งธ ํญ)๋ก ๊ฐ์ ์ class์ ๋ช ์
์ด์ ์ ์์ฑํ๋ swift ํ์ผ๋ก ์ง์ ํด์ฃผ์ธ์~
๋ง์ฝ์ xib์ด๋ฆ์ CommonView.xib ์ด๊ณ ,
class ์ ์ด๋ฆ์ CommonTextField.swift๋ผ๋ฉด
์ ๊ธฐ์๋ CommonTextField๊ฐ ๋ค์ด๊ฐ๋ฉด ๋๋ ๊ฑฐ์ฃ !
์ด๋ฌ๋ฉด ๋์ด๋ ํ๊ธฐ ์ ์
File's owner์ ์ดํดํด ๋ณด๊ฒ ์ต๋๋ค
์ธํฐํ์ด์ค ๋น๋์ธ .xib ํ์ผ์ ์ปดํ์ผํ์ฌ nib ํ์ผ์ ์์ฑํฉ๋๋ค.
nib ํ์ผ์ UI ๊ด๋ จ ๊ฐ์ฒด์ ์์ฑ, ๊ฐ์ฒด๊ฐ ์ฐ๊ฒฐ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ด์
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ
File's owner๋
loadNibNamed: ํน์ initWithNibName: ์ ์ด์ฉํ์ฌ nib๋ฅผ ๋ก๋ํฉ๋๋ค
๋ฐํ์ ๋์ xib ํ์ผ์ด nib ํ์ผ๋ก ์ปดํ์ผ ๋์ด ๋ก๋ ๋๋ฉด
file's owner์์ ์ค์ ํ outlet์ ์ฌ์ฉํ์ฌ ์ค๋ธ์ ํธ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋
์๋ธ๋ทฐ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
ํ์ฌ File's owner๋ก๋ง ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค
File's owner๋ก CommonTextField๋ฅผ ์ค์ ํด ์ฃผ์๊ธฐ ๋๋ฌธ์
CommonTextField์์ IBAction์ด๋ IBOutlet์ ์ฐ๊ฒฐํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ๋
loadNibNamed๋ก ๋ก๋ํด ์ฃผ์ด์ผ ํฉ๋๋ค
Extension์ ์์ฑํด ์ฃผ๊ฒ ์ต๋๋ค
extension UIView {
func loadXib() {
// 1
let identifier = String(describing: type(of: self))
// 2
let nibs = Bundle.main.loadNibNamed(identifier, owner: self, options: nil)
// 3
guard let customView = nibs?.first as? UIView else { return }
// 4
customView.frame = self.bounds
// 5
self.addSubview(customView)
}
}
์ถ์ฒ : https://dongminyoon.tistory.com/50
1.
ํ์ฌ loadXib๋ฅผ ํธ์ถํ ํด๋์ค์ ์ด๋ฆ์ identifier ๋ณ์๋ก ๋ฐ์ต๋๋ค
2.
loadNibNamed๋ก nib๋ฅผ ๋ก๋ํด ์ค๋๋ค owner๋
ํ์ฌ ํด๋น ํจ์๋ฅผ ํธ์ถํ๋ File's owner์ธ CommonTextField ์ด๊ณ self๋ก ์ง์ ํด ์ฃผ๋ฉด ๋ฉ๋๋ค
3.
xib ์ธํฐํ์ด์ค ๋น๋ ์์๋ ์ฌ๋ฌ๊ฐ์ ๋ทฐ๋ฅผ ์ถ๊ฐ ํ ์ ์์ต๋๋ค
๋ฐ๋ผ์ loadNibNamed๋ฅผ ํด์ค ๋ ํ๋์ ๋ทฐ๋ง ๊ฐ์ง๊ณ ์ค๋๊ฒ ์๋๋ผ
์ต์์์ ์ถ๊ฐํด ์ค ๋ทฐ๋ค์ array๋ก ๊ฐ์ง๊ณ ์ค๊ธฐ ๋๋ฌธ์
๊ทธ ์ค ์ฒซ ๋ฒ์งธ (์ง๊ธ์ ํ๋์ view ๋ฐ์ ์์ง๋ง)๋ฅผ ๊ฐ์ง๊ณ ์ค๋๊ฑฐ์์
4.
๋ทฐ ํฌ๊ธฐ์ ๋ง์ถฐ์ customView์ ์ฌ์ด์ฆ์ ์์น๋ฅผ์ง์ ํด ์ค๋๋ค.
5.
ํ์ฌ UIView์ nib๋ฅผ ํตํด ๋ก๋ํ customView ๋ฅผ ์ถ๊ฐ ํด ์ค๋๋ค.
class CommonTextField: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
self.loadXib()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
self.loadXib()
}
}
์ด์ ์ปค์คํ ๋ทฐ๋ก ๋์์์ ์ด๋์ ๋ผ์ด์ ์
extension ์์ ์ง์ ํ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค
๋ง์ง๋ง์ผ๋ก ์ฌ์ฉํ๊ณ ์ ํ๋ VC์
view๋ฅผ ์ถ๊ฐํด ์ฃผ์๊ณ
Custom class๋ฅผ ์ง์ ํด ์ฃผ์๋ฉด ์ฑ๊ณต์ ์ผ๋ก ๋ก๋ ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ด์
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด UIView ๊ฐ File's owner๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์
์ด custom view๋ฅผ ์์ฑํ UIViewController์ File's owner๋ฅผ ์ง์ ํด ์ฃผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค
์๋ ์ง์ ํด ์ฃผ์๋ File's Owner์์ ์ปค์คํ ํด๋์ค๋ฅผ ์ง์ ์ค๋๋ค
์ง์ฐ๊ณ ์ํฐ ๋๋ฅด๊ธฐ!
๋ทฐ๋ฅผ ๋๋ฅด๊ณ ์ธ์คํํฐ๋ก ๋์๊ฐ์
์ปค์คํ ํด๋์ค๋ฅผ ์ง์ ํด ์ค๋๋ค
class CommonTextField: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
// self.loadXib()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
// self.loadXib()
}
}
์ด๋์ ๋ผ์ด์ ์์ ํธ์ถํ๋ ์ต์คํ ์ ํจ์๋ฅผ ์ฃผ์ ์ฒ๋ฆฌํด ์ฃผ์ธ์
VC์ ์ฐ๊ฒฐ๋์ด ์๋ ์ธํฐํ์ด์ค ๋น๋์ ์ถ๊ฐํด ์ค ๋ทฐ์
Custom class ๋ ์ง์์ค๋๋ค
๊ทธ๋ฆฌ๊ณ ์ด ๋ทฐ๋ฅผ VC์ IBOutlet์ผ๋ก ์ฐ๊ฒฐํด ์ฃผ์ธ์
@IBOutlet weak var customView: UIView!
class RegisterFirstViewController: UIViewController {
@IBOutlet weak var customView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let nibs = Bundle.main.loadNibNamed("CommonTextField", owner: self)
guard let commonTextField = nibs?.first as? CommonTextField else {
return
}
commonTextField.frame = customView.bounds
customView.addSubview(commonTextField)
}
}
์ด์ ์ด custom UIView๋ฅผ ํ์๋ก ํ๋ VC์์
ํ์ํ ๊ณณ์ ๋ก๋ํด ์ฃผ๋ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค
์ด๋ ๊ฒ ํ๋ฉด File's Owner๋ฅผ VC๊ฐ ๊ฐ์ ธ๊ฐ ์ ์์ต๋๋ค
custom class ๋ฅผ ์์ฑํ๋ค -> xib ํ์ผ์ ์์ฑํ๋ค -> nib ํ์ผ๋ก ๋ก๋ํ๋ค
์ด๋ ๊ฒ ์ ๋ฆฌํ์๋ฉด ๋ ๊ฑฐ ๊ฐ์์
ํน์ ๋ฌธ์ ๊ฐ ์๊ฑฐ๋ ํ๋ฆฐ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
์ฐธ๊ณ ๋์ ๋ฐ ์ฌ์ดํธ
https://stackoverflow.com/questions/15251370/what-is-the-files-owner-in-interface-builder
'๐ iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ์์กด์ฑ ์ฃผ์ ์ ํ์ํ ๊น? DI ์์๋ณด๊ธฐ (0) | 2022.04.29 |
---|---|
[Swift] insetBy ์์๋ณด๊ธฐ (0) | 2022.04.23 |
[iOS/Swift] ๋ช ์ด ํ์ ์ฝ๋ ์คํํ๊ธฐ DispatchQueue asyncAfter (0) | 2022.03.19 |
[iOS/Swift] custom font ์ง์ ํ๊ณ UIFont ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2022.03.19 |
[Swift] PHPhotoLibraryChangeObserver ์ LimitedAccessAlert (2) | 2022.02.10 |
๋๊ธ