답변:
init(frame:)
버전은 기본 이니셜이다. 인스턴스 변수를 초기화 한 후에 만 호출해야합니다. 이 뷰가 펜촉에서 재구성되는 경우 사용자 정의 이니셜 라이저가 호출되지 않고 대신 init?(coder:)
버전이 호출됩니다. Swift는 이제 required의 구현이 필요하므로 init?(coder:)
아래 예제를 업데이트하고 let
변수 선언을 var
선택적으로 변경했습니다 . 이 경우 awakeFromNib()
나중에 또는 나중에 초기화합니다 .
class TestView : UIView {
var s: String?
var i: Int?
init(s: String, i: Int) {
self.s = s
self.i = i
super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
init(coder:)
.
s
및 i
옵션 여기 것들을 간단하게 유지. 선택 사항이 아닌 경우 필수 이니셜 라이저에서 초기화해야합니다. 그들에게 할 수 선택 수단 만들기 nil
할 때 super.init()
호출됩니다. 선택 사항이 아닌 경우 super.init ()를 호출하기 전에 할당해야합니다.
지정 및 필수에 대한 공통 초기화를 작성합니다. 편의상 나는 init(frame:)
0 프레임으로 위임 합니다.
프레임이없는 것은 일반적으로 뷰가 ViewController의 뷰 안에 있기 때문에 문제가되지 않습니다. 사용자 정의보기는 슈퍼 뷰 호출시 layoutSubviews()
또는 서브 뷰를 레이아웃 할 수있는 안전하고 좋은 기회를 얻습니다 updateConstraints()
. 이 두 함수는 뷰 계층 전체에서 시스템에 의해 재귀 적으로 호출됩니다. 당신도 사용할 수 있습니다 updateContstraints()
또는 layoutSubviews()
. updateContstraints()
먼저 호출 layoutSubviews()
됩니다. 에서 updateConstraints()
확인 슈퍼 호출하는 마지막 . 에서 먼저layoutSubviews()
super를 호출하십시오 .
내가하는 일은 다음과 같습니다.
@IBDesignable
class MyView: UIView {
convenience init(args: Whatever) {
self.init(frame: CGRect.zero)
//assign custom vars
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
commonInit()
}
private func commonInit() {
//custom initialization
}
override func updateConstraints() {
//set subview constraints here
super.updateConstraints()
}
override func layoutSubviews() {
super.layoutSubviews()
//manually set subview frames here
}
}
commonInit
메소드 에서 일부 특성을 초기화하려는 super
경우 super
호출하기 전에 모든 특성을 초기화해야하므로이 경우 이후 에 배치 할 수 없습니다 . 그것은 죽은 루프처럼 보입니다.
Swift의 iOS 9에서 수행하는 방법은 다음과 같습니다.
import UIKit
class CustomView : UIView {
init() {
super.init(frame: UIScreen.mainScreen().bounds);
//for debug validation
self.backgroundColor = UIColor.blueColor();
print("My Custom Init");
return;
}
required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented"); }
}
다음은 예제가 포함 된 전체 프로젝트입니다.
super.init
에 사용자 정의를 수행하는 것을 의미 하지만, 그는 전에 수행해야한다고 말했다 super.init
...
Swift에서 iOS에서 서브 뷰를 수행하는 방법은 다음과 같습니다.
class CustomSubview : UIView {
init() {
super.init(frame: UIScreen.mainScreen().bounds);
let windowHeight : CGFloat = 150;
let windowWidth : CGFloat = 360;
self.backgroundColor = UIColor.whiteColor();
self.frame = CGRectMake(0, 0, windowWidth, windowHeight);
self.center = CGPoint(x: UIScreen.mainScreen().bounds.width/2, y: 375);
//for debug validation
self.backgroundColor = UIColor.grayColor();
print("My Custom Init");
return;
}
required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented"); }
}
var
. 그러나 Swift의 기본 모범 사례는 변수let
를 선언 할 이유가없는 한 변수 를 선언하는 것var
입니다. 위의 코드 예제에서 그렇게 할 이유가 없었으므로let
.