ios – 将UIViewController视图属性设置为不带有storyboardnib的自定义UIView类

ios – 将UIViewController视图属性设置为不带有storyboardnib的自定义UIView类,第1张

概述我有一个名为LoginViewController的UIViewController.我想在一个名为LoginView的自定义UIView类中完全以编程方式构建该LoginViewController的视图,而不是构建我的LoginViewController中的所有元素.这样我就阻止了Controller类(MVC)中的“View”代码. 在下面的代码中,我将LoginViewControlle 我有一个名为LoginVIEwController的UIVIEwController.我想在一个名为LoginVIEw的自定义UIVIEw类中完全以编程方式构建该LoginVIEwController的视图,而不是构建我的LoginVIEwController中的所有元素.这样我就阻止了Controller类(MVC)中的“VIEw”代码.

在下面的代码中,我将LoginVIEwController的视图设置为我的LoginVIEw,为简单起见,它只包含2个UILabels

class LoginVIEwController: UIVIEwController {overrIDe func loadVIEw() {    super.loadVIEw()    self.vIEw = LoginVIEw(frame: CGRect.zero)}

LoginVIEw类初始化两个标签,并应设置一些约束.

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?或者上面的代码片段是推荐的吗?

This is the working solution based on Jadar’s answer:

06002

结果:

解决方法 看来这里真的有两个问题.一,以编程方式设置VIEwController的最佳方法是什么.另一种,如何以编程方式设置VIEw.

首先,以编程方式使用不同UIVIEw子类的VIEwController的最佳方法是在loadVIEw方法中初始化并分配它.按Apple docs:

You can overrIDe this method in order to create your vIEws manually.
If you choose to do so,assign the root vIEw of your vIEw hIErarchy to
the vIEw property. The vIEws you create should be unique instances and
should not be shared with any other vIEw controller object. Your
custom implementation of this method should not call super.

这看起来像这样:

class LoginVIEwController: UIVIEwController {        overrIDe func loadVIEw() {        // Do not call super!        vIEw = LoginVIEw()    }}

这样你就不必处理它的大小调整,因为VIEw Controller本身应该处理它(就像它自己的UIVIEw一样).

记住,不要调用super.loadVIEw()或控制器会混淆.此外,我第一次尝试这个时,我得到一个黑屏,因为我忘了在我的App Delegate中调用window.makeKeyAndVisible().在这种情况下,视图从未添加到窗口层次结构中.您始终可以使用Xcode中的视图introspecter按钮来查看正在发生的事情.

其次,您需要在UIVIEw子类中调用self.addSubvIEw(_ :)才能显示它们.将它们添加为子视图后,可以使用NSLayoutConstraint添加约束.

private func setupLabels(){    // Initialize labels and set their text    usernameLabel = UILabel()    usernameLabel.text = "Username"    usernameLabel.translatesautoresizingMaskIntoConstraints = false // Necessary because this vIEw wasn't instantiated by IB    addSubvIEw(usernameLabel)    passwordLabel = UILabel()    passwordLabel.text = "Password"    passwordLabel.translatesautoresizingMaskIntoConstraints = false // Necessary because this vIEw wasn't instantiated by IB    addSubvIEw(passwordLabel)    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "V:|-10-[vIEw]",options: [],metrics: nil,vIEws: ["vIEw":usernameLabel]))    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "V:|-20-[vIEw]",vIEws: ["vIEw":passwordLabel]))    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-10-[vIEw]",vIEws: ["vIEw":usernameLabel]))    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-20-[vIEw]",vIEws: ["vIEw":passwordLabel]))}

有关用于创建约束的可视格式语言的更多信息,请参阅VFL Guide

总结

以上是内存溢出为你收集整理的ios – 将UIViewController视图属性设置为不带有storyboard / nib的自定义UIView类全部内容,希望文章能够帮你解决ios – 将UIViewController视图属性设置为不带有storyboard / nib的自定义UIView类所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1101091.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存