2017-11-04 6 views
1

私はストーリーボードを使わずにプログラミングを始めました。私がやろうとしているのは、UIViewと制約を初期化するコードを移動することです。そこから別のファイルにも入れたいと思っています。その別のファイルを呼び出し、設定私のviewDidLoadからViewControllerファイルの外に制約とオブジェクトを設定することはできますか?

():

理想的には、私は1つのコール

view.addSubview(view.frame)loginControllerObjects(フレーム)を持っていると思いますViewControllerのクラッタをなくすために、適切な場所にオブジェクトを配置します。

私はこの問題のほとんどを解決しましたが、私の関数setUpInputContainer()が "NSException型のキャッチされていない例外で終了"しているようです。そのアンカーのために、異なるビュー階層のアイテムを参照することが推奨されています。誰もこの問題を回避する方法を知っていますか?

アプリの委任

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    window = UIWindow(frame: UIScreen.main.bounds) 

    let homeViewController = ViewController() 
    window?.rootViewController = UINavigationController(rootViewController: homeViewController) 
    window!.makeKeyAndVisible() 

    return true 

} 

ビューコントローラ

class ViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.navigationController?.isNavigationBarHidden = true 
    view.addSubview(loginControllerContraints(frame: view.frame)) 
} 

} 

extension UIColor { 
    convenience init(r: CGFloat, g: CGFloat, b: CGFloat) { 
     self.init(red: r/255, green: g/255, blue: b/255, alpha: 1) 
    } 
} 

LoginControllerContraints

class loginControllerContraints: UIView { 

override init(frame: CGRect) { 
    super.init(frame: frame) 

    backgroundColor = UIColor(r: 61, g: 91, b: 151) 
    setUpInputContainer() 
    addSubview(inputsContainerView) 

} 

let inputsContainerView: UIView = { 
    let view = UIView() 
    let red = UIColor.red 
    view.backgroundColor = UIColor.white 
    view.translatesAutoresizingMaskIntoConstraints = false 
    view.layer.cornerRadius = 5 
    view.layer.backgroundColor = red.cgColor 
    view.layer.masksToBounds = true 
    return view 
}() 

var inputsContainerViewHeightAnchor: NSLayoutConstraint? 

func setUpInputContainer() { 
    //Needs x, y, height, and width constraints for INPUTCONTAINER 
    inputsContainerView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true 
    inputsContainerView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true 
    inputsContainerView.widthAnchor.constraint(equalTo: widthAnchor, constant: -24).isActive = true 
    inputsContainerViewHeightAnchor = inputsContainerView.heightAnchor.constraint(equalToConstant: 150) 
    inputsContainerViewHeightAnchor?.isActive = true 


} 

//Required do not touch 
required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 


} 

答えて

0

loginControllerContraintsに追加する前に、setUpInputContainerに電話するのが問題です。

修正するには、inputsContainerViewの制約を追加する前にinputsContainerViewloginControllerContraintsに追加します。 initメソッドをloginControllerContraintsに変更してください。

override init(frame: CGRect) { 
    super.init(frame: frame) 

    backgroundColor = UIColor(r: 61, g: 91, b: 151) 
    addSubview(inputsContainerView) 
    setUpInputContainer() 
} 
+0

うわー、私はそれを逃したとは思わない。明確な応答に感謝します。 –

+0

ようこそ@ChandlerLong;) – trungduc

関連する問題