无需 nib 以编程方式实例化 UIViewController

Posted

技术标签:

【中文标题】无需 nib 以编程方式实例化 UIViewController【英文标题】:Instantiate UIViewController programmatically without nib 【发布时间】:2016-05-30 13:03:57 【问题描述】:

我想在不使用笔尖或情节提要的情况下以编程方式创建UIViewController

我认为将UIViewController 实现为:

class TestViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        //Add some setup code here, without it it should just be blank
    

let vc = TestViewController(nibName: nil, bundle: nil) 或只是TestViewController() 实例化它

然后直接推:

navigationController?.pushViewController(vc, animated: true)

但它显示了带有透明视图的navigationController(上栏)(正在显示后面的UIWindow,我有一个多窗口设置)

【问题讨论】:

【参考方案1】:

根据文档:

如果视图控制器没有关联的 nib 文件,则此方法将创建一个普通的 UIView 对象。

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instp/UIViewController/view

如果在实例化视图控制器时没有提供 nib 文件,UIViewController 会调用它的 loadView() 方法,该方法会创建一个普通的 UIView 对象并将其分配给它的视图属性。

您看到透明视图的原因是 UIView 对象没有背景颜色。为了验证这一点,您可以在将视图控制器的视图属性推送到导航堆栈之前设置它的背景颜色。

let viewController = TestViewController()
viewController.view.backgroundColor = .blueColor()
navigationController?.pushViewController(viewController, animated: true)

【讨论】:

看来我使用的是viewDidLoad 而不是loadView。那是我的问题。 没错。如果您需要为视图控制器提供自定义 UIView 实现,请覆盖 loadView 方法。【参考方案2】:

您需要在UIViewControllerloadView 方法中设置您的视图,并将您的根视图分配给view 属性。

更多详情请参见https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instm/UIViewController/loadView。

【讨论】:

每个 UIViewController 都应该有一个它拥有的***视图,其中包含所有其他视图。对此视图的引用存储在 UIViewController 的视图属性中。可以在此处找到有关此属性的更多详细信息:developer.apple.com/library/ios/documentation/UIKit/Reference/…【参考方案3】:

你可以这样做,

 let vc = UIViewController()

    let view1 = UIView()

    view1.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)

    view1.backgroundColor = UIColor.orangeColor()
    vc.view = view1


    navigationController?.pushViewController(vc, animated: true)

希望这会有所帮助:)

【讨论】:

这没什么区别。相同的行为。 设置背景颜色以查看。所以你知道它正在工作

以上是关于无需 nib 以编程方式实例化 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

为 UIView 子类加载 Nib 的正确方法

以编程方式更新 nib 的框架和内容

以编程方式加载 nib2 时,来自 nib1 的 awakeFromNib 被调用

以编程方式实例化 TableViewController 子类后,它的出口为零

以编程方式创建 UITableViewCell 或从 nib 加载是不是更快?

以编程方式实例化 vuetify-components