是否可以在ViewController文件之外设置约束和对象?

问题描述:

我不是使用故事板编程的新手。我想要做的是移动负责初始化UIView和约束的代码,从那里我也想把它们放在另一个文件中。是否可以在ViewController文件之外设置约束和对象?

理想情况下,我想有一个呼叫

view.addSubview(loginControllerObjects(帧:view.frame))

从我的viewDidLoad()的调用单独的文件,并设置对象放置在适当的位置,以保持我的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") 
} 


} 

问题是您在添加inputsContainerViewloginControllerContraints之前致电setUpInputContainer

要修复它,请在添加inputsContainerView的任何约束之前,将inputsContainerView添加到loginControllerContraints。用以下代码替换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