UIViewController
LoginViewController
といいます。私はそのLoginViewController
のビューを、LoginViewController
内のすべての要素を構築する代わりに、のカスタムUIView
クラスをLoginView
と呼びます。このようにして、コントローラクラス(MVC)の「表示」コードを禁止します。ストーリーボード/ペンなしのUIViewControllerビュープロパティをカスタムUIViewクラスに設定します
は簡単にするためだけLoginViewクラスは両方のラベルを初期化し、いくつかの制約を設定する必要があります2 UILabels
class LoginViewController: UIViewController {
override func loadView() {
super.loadView()
self.view = LoginView(frame: CGRect.zero)
}
が含まれている私のLoginView
に私のLoginViewController
のビューを設定しています。
class LoginView: UIView {
var usernameLabel: UILabel!
var passwordLabel: UILabel!
override init (frame : CGRect) {
super.init(frame : frame)
setupLabels()
}
convenience init() {
self.init(frame:CGRect.zero)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
private func setupLabels(){
//Init labels and set a simple text
self.usernameLabel = UILabel()
self.usernameLabel.text = "Username"
self.passwordLabel = UILabel()
self.passwordLabel.text = "Password"
//Set constraints which aren't possible since there is no contentView, perhaps using the frame?
}
}
ビューの境界が0しかし、私はこれが可能であるかどうかに洞察力を与える任意のリソースを見つけることができませんでしたが、私は動作しませんでした私のアプローチを試してみましたので、これは動作しません。
UIViewControllerのビューをプログラムで作成されたカスタムUIViewに設定する方法はありますか。または上記のスニペットをお勧めですか?
これはJadarの回答に基づいて実用的なソリューションです:
class LoginViewController: UIViewController { override func loadView() { view = LoginView() } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } } class LoginView: UIView { var usernameLabel: UILabel! var passwordLabel: UILabel! override init(frame: CGRect) { super.init(frame: frame) self.usernameLabel = UILabel() self.usernameLabel.text = "Username" self.passwordLabel = UILabel() self.passwordLabel.text = "Password" addSubview(usernameLabel) addSubview(passwordLabel) if let superview = usernameLabel.superview{ //Setting AutoLayout using SnapKit framework usernameLabel.snp.makeConstraints { (make) in make.center.equalTo(superview) } } }
結果:
コードを見るには、ビューコントローラの正しいではありません。 viewDidLoadでself.viewを設定しないでください。もともとのようにloadViewで行います。 – rmaddy
フィードバックいただきありがとうございます! @rmaddy – Hapeki