我想以与Apple MFMessageComposeViewController
相同的方式创建一个自定义类,这是一个可以从代码初始化的自定义类,没有任何具有导出栏的能够推送和弹出的故事板等等上。到目前为止,我的设计已经是UINavigationController
的子类,并用UIViewController
的子类初始化它。我们分别称这些类为CustomClassVC
和CustomClassContentVC
。因此代码看起来像这样:
private let contentVC = CustomClassContentVC()
init() {
super.init(rootViewController: contentVC)
}
init(parameters: CustomParameterClass) {
super.init(rootViewController: contentVC)
self.parameters = parameters
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
此设计的第一个问题是,为了用户友好,我希望代码的用户能够说出CustomClassVC.myCustomProperty
而不是CustomClassVC.contentVC.myCustomProperty
。我通过在两个类中创建属性来解决这个问题,其中CustomClassVC
中的属性具有访问CustomClassContentVC
中的等效属性的setter和getter。 所以......第一个问题:这是一种“正确”的方式,还是有更好的方法来实现内置导航栏的视图控制器?
下一步:如果通过调用CustomClassVC
初始化init()
,则一切正常。但是,如果直接调用init(nibName...)
,则CustomClassContentVC
将不会被设置为根视图控制器。另一个相关的“问题”是init(rootViewController:...)
通过超类调用init(nibName...)
。这意味着,如果我在尚未设置根视图控制器的初始化程序中添加setViewControllers([contentVC], animated: false)
,则它们将始终覆盖init(rootViewController:...)
。因此我无法在此设置根视图控制器。解决这个问题的方法是为一个变量指定是否已经调用init()
,但它似乎不是一个好的解决方案(顺便说一下,我试过这个,但是遇到了一个奇怪的问题,{{ 3}}。另一个解决方案是在init(nibName...
中设置根视图控制器并使init()
成为一个便利初始化器,但是当我们专门为分配根视图设置初始化器时感觉不对初始化期间的控制器。 因此,问题2:如何分配根视图控制器并确保无论调用哪个初始化程序都设置正确?