使用故事板的自定义初始化方法的视图控制器

50

我在尝试覆盖Storyboard中设计的CustomViewController的初始化方法,但遇到了问题。

现在我正在我的mainViewController中这样做:

self.customViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"CustomVC"];
self.customViewController.myObject = someObject;

我在CustomViewController的viewDidLoad方法中有如下代码:

    [self.label setText:self.myObject.someString];

这个方法可以正常工作。

但是,这是否是正确的方法呢?我应该向我的CustomViewController添加一个自定义的init方法(或重写)吗?比如initWithObject:?我不知道如何调用我的自定义初始化方法,而不是使用“UIStoryboard instantiateViewControllerWithIdentifier:”,并且我没有收到对“init”或“initWithNibName”的调用。

也许我应该使用: -(id)initWithCoder:(NSCoder *)decoder

请给我一些建议!

谢谢!


你做得很好。你可以在自定义类中覆盖initWithCoder方法,即_customViewController对象的类文件,以进行自定义初始化。 - VJ Vélan Solutions
2个回答

58

在storyboard中,视图控制器的指定初始化方法是-initWithCoder:。由于大多数从storyboard创建的视图控制器都是通过segue创建的,在-prepareForSegue:sender:期间通常会设置状态。

如果您直接从storyboard实例化视图控制器,就像您提供的示例一样,那么所选模式是适当的。


很高兴知道我正在按照预期进行操作! - Nicolas S
2
这是一个相当糟糕的设计,因为它让你在Swift中使用Optionals(带有!?)或者访问可能为空的变量,如果开发人员忘记设置正确的变量。很遗憾,这是“适当”的解决方案:关于Swift/Objective C可选项的一个好资源:http://www.objc.io/issue-16/power-of-swift.html - Guilherme Silveira
只是回应@GuilhermeSilveira的评论,这个问题是来自2012年,在那时Swift甚至还不为公众所知,即使它已经存在,Objective-C和Swift之间的设计模式也有很大的不同,因此如果你正在使用Swift进行开发,就不应该坚持这种模式。 - Nicolas S
在Swift中,有没有一种模式可以避免使用可选值或隐式解包可选值加载从Storyboard加载的视图控制器? - bobics

0
作为解决此问题的另一种“变通方法”,您可以使用委托。创建一个协议,作为您的故事板中UIViewController子类的数据源。遵循此数据源协议,实现它并在加载UIViewController子类后立即使用它:
required init?(coder aDecoder: NSCoder)
    {
        super.init(coder: aDecoder)

        //invoke your data source here
    }

我知道...我也不喜欢这个,但是... ;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接