IBOutlet Collection 이란?
IBOutlet Collection 은 하나의 뷰에 공통으로 동일한 레이아웃을 구성할 때 활용할 수 있다.
IBOutlet Collection 활용
다음과 같은 뷰를 IBOutlet Collection 을 활용하지 않고 구현한다고 가정해보자. ① UIButton 에 대한 IBOutlet 변수 2개,
② UILabel 에 대한 IBOutlet 변수 2개, ③ UILabel 에 대한 IBOutlet 변수 2개, 총 6개의 IBOutlet 변수가 ViewController 상에 그려진다.
또한 이에 대한 레이아웃을 구성할 경우 하나하나 CornerRadius, font, BackgroundColor... 을 지정해줘야 하므로, 코드의 길이가 길어지고, 가독성 또한 낮아진다.
이러한 경우 IBOutlet Collection 을 활용하여 가독성을 높일 수 있다.
IBOutlet 실습
@IBOutlet var testSubLabelCollection: [UILabel]!
@IBOutlet var testMainLabelCollection: [UILabel]!
@IBOutlet var testButtonCollection: [UIButton]!
다음과 같이 공통되는 뷰에 대한 IBOutlet Collection 을 생성한다. 이후 Collection 에 포함되는 각 뷰에 대한 레이아웃을 다음과 같이 구성할 수 있다.
self.testSubLabelCollection.forEach { testSubLabel in
testSubLabel.font = UIFont.NFont.testSubLabelFont
testSubLabel.textColor = UIColor.NColor.gray
}
self.testMainLabelCollection.forEach { testMainLabel in
testMainLabel.font = UIFont.NFont.testMainLabelFont
testMainLabel.textColor = UIColor.NColor.black
}
self.testButtonCollection.forEach { testButton in
testButton.layer.opacity = 1.0
testButton.tintColor = UIColor.clear
testButton.layer.cornerRadius = 10.0
}
IBOutletCollection 는 weak 로 선언이 가능할까?
// IBOutlet 변수
@IBOutlet weak var rainTestMainImage: UIImageView!
// IBOutlet Collection 변수
@IBOutlet var testButtonViewCollection: [UIView]!
위와 같이 IBOutlet Collection 변수를 생성할 때 다음과 같이 weak 수식어가 붙지 않는다. 무지성으로 weak 를 붙여보았다.
'weak' may only be applied to class and class-bound protocol types
다음과 같은 에러가 뜬다.
"weak 수식어는 Reference Count 관리를 위한 수식어이기 때문에 Class 또는 Class 를 따르는 Protocol 타입에서 적용될 수 있다."
이에 따라 하나의 이유를 도출할 수 있다.
① IBOutlet Collection 은 객체의 배열 로 선언되어 있기 때문에 구조체 타입이므로, Class 참조 타입으로 선언된 IBOutlet 과 달리 weak 를 붙일 수 없다.
두번째 이유는 IBOutlet Collection 은 Top-level Object(최상위 개체) 이라는 것이다.
Apple Resource Programming Guide 에 따르면
Outlets should generally be weak, except for those from File’s Owner to top-level objects in a nib file (or, in iOS, a storyboard scene) which should be strong.
이라 기술되어 있다.
즉, 다음과 같이 정리할 수 있다.
② 하위 뷰들에 대한 Owner 인 IBOutlet Collection 은 Strong Reference 를 유지하여 하위 뷰들에 대한 Reference 를 잃지 않게 하기 위함이다.
' iOS > UIKit' 카테고리의 다른 글
JSON 데이터를 어떻게 사용자 타입으로 변환할 수 있을까? (0) | 2022.09.30 |
---|---|
NSCache 를 활용한 이미지 캐싱 (1) | 2022.09.30 |
CALayer 와 CAAnimation (0) | 2022.09.23 |
resignFirstResponder vs .endEditing (0) | 2022.09.06 |
URLSession 을 활용하여 도시 날씨 데이터 가져오기 (1) | 2022.08.30 |