如何初始化一个 Nib 是 Storyboard 的 UIViewController

Posted

技术标签:

【中文标题】如何初始化一个 Nib 是 Storyboard 的 UIViewController【英文标题】:How to init a UIViewController whose Nib is the Storyboard 【发布时间】:2016-08-30 19:20:30 【问题描述】:

我有以下UIViewController

class ViewController: UIViewController

    var dayDatasource : DayDatasource;

    init()
        self.dayDatasource = DayDatasource();
        super.init(nibName:nil, bundle: nil);
    

    required init?(coder aDecoder: NSCoder) 
        self.dayDatasource = DayDatasource();
        super.init(nibName:nil, bundle: nil);
    

    override func viewDidLoad() 
        super.viewDidLoad();
    

现在,因为我声明了 dayDatasource 属性,swift 迫使我创建 init 方法。当我创建init 方法时,它会抱怨我需要为UIViewController 调用指定的init 方法。谷歌搜索后,显然指定的`init方法是:

super.init(nibName:nil, bundle: nil);

但是,当我使用它时,我会得到一个后屏幕。如果我尝试以下操作:

super.init(nibName:"ViewController", bundle: NSBundle.mainBundle());

我收到以下错误:

无法在包中加载 NIB:“NSBundle”

在这种情况下我该怎么办?

【问题讨论】:

你是如何实例化你的视图控制器的? ViewController 类是主故事板中 viewController 的文件所有者。过去在使用故事板时,我从来不需要实例化我的视图控制器 【参考方案1】:

如果您使用故事板转场进行导航,您应该使用?!dayDatasource 设为可选或强制展开可选。这将避免要求您创建未使用的 init 方法。

然后,在您从中导航的视图控制器中,覆盖func prepare(for segue: UIStoryboardSegue, sender: Any?) 函数并设置dayDatasource 变量。

另一方面,如果这是第一个显示的视图控制器,或者您总是想要一个新的 dayDatasource 实例,只需在变量声明中创建该实例,就不再需要自定义 init。

var dayDatasource = DayDatasource()

【讨论】:

首先感谢您的回答,通过使用 var dayDatasource = DayDatasource()?它不需要 init 方法。话虽如此,我觉得这可能是一个黑客?这是他们应该这样做的方式吗?或者这是一个 Swift 的事情?在目标 c 中,这些问题从未遇到过。 不,以这种方式初始化变量不是黑客行为。您甚至可以添加 lazy 关键字来推迟其初始化。【参考方案2】:

你应该这样写:

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)   
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

不将 nibName 传递给 nil 或硬编码。

如果这能解决您的问题,请在 cmets 中告诉我

【讨论】:

以上是关于如何初始化一个 Nib 是 Storyboard 的 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

为 StoryBoard 中 ViewController 中使用的 UIView 加载 Nib

在 Nib 而不是 Storyboard 中创建 UITabBarController

使用 NIB 从 Storyboard 中定义 UITableViewCell

为从 Nib 或 Storyboard 生成的 WKWebView 设置自定义 WKWebViewConfiguration

如何使用Storyboard创建UIPageViewController

如何使用Storyboard创建UIPageViewController