2012-03-18 68 views
50

即时通讯有麻烦重写初始化方法为我的故事板中设计的我的CustomViewController。视图控制器自定义初始化方法与故事板

现在即时通讯做(在我mainViewController):

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

和我在viewDidLoad中(CustomViewController)

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

该工程确定。

但是,这是正确的方法吗?我应该添加一个自定义的init方法(或覆盖)到我的CustomViewController?像initWithObject一样:?我不知道如何调用我的自定义初始化方法,而不是UIStoryboard instantiateViewControllerWithIdentifier:,并且我没有接到调用initinitWithNibName。我可以使用:- (id)initWithCoder:(NSCoder *)decoder

请给我一些建议!

谢谢!

+0

你正在做的一切都正确。你可以在你的自定义类中覆盖initWithCoder,也就是你的_customViewController对象的类文件来做自定义init – 2013-07-05 04:19:40

回答

58

故事板中视图控制器的指定初始值为-initWithCoder:。由于故事板中的大多数视图控制器都是通过segse创建的,因此您通常会在-prepareForSegue:sender:期间看到设置的状态。

如果您直接从故事板实例化视图控制器,就像您提供的示例那样,那么您选择的模式是合适的。

+0

很高兴知道我在做的事情应该如此! – 2012-03-25 16:30:31

+2

这是一个非常糟糕的设计,因为它让你在swift(with!?)中使用Optionals,或者如果开发人员忘记设置正确的变量,则可以访问可能的nils。很遗憾,这是“适当”的解决方案:在这个问题上,一个很好的来源,可选择快速/客观的:http://www.objc.io/issue-16/power-of-swift.html – 2014-10-16 16:31:02

+0

只是为了回应到@GuilhermeSilveira的评论,这个问题是从2012年开始,Swift甚至不为公众所知,即使是这样,设计模式在Objective-C和Swift之间也有很大的不同,所以如果你正在开发中,不应该坚持这种模式迅速。 – 2015-11-23 20:35:23

0

作为此问题的另一个“解决方法”,您可以使用委派。创建一个协议,作为故事板中的UIViewController子类的数据源。顺应此数据源协议,实现它和加载你的UIViewController子类后立即使用它:

required init?(coder aDecoder: NSCoder) 
    { 
     super.init(coder: aDecoder) 

     //invoke your data source here 
    } 

我知道......我也不喜欢这一点,但...;)

相关问题