繁体   English   中英

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

[英]How to init a UIViewController whose Nib is the Storyboard

我有以下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”

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

你应该这样写:

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

而不将nibName传递为nil或进行硬编码。

如果这可以解决您的问题,请在评论中让我知道

如果您使用情节提要剧集进行导航,则应将dayDatasource为可选,或使用?强制展开? ! 这样可以避免要求您创建未使用的init方法。

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

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

var dayDatasource = DayDatasource()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM