如何初始化一个 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