带有情节提要的 viewController 自定义初始化方法

Posted

技术标签:

【中文标题】带有情节提要的 viewController 自定义初始化方法【英文标题】:viewController custom init method with storyboard 【发布时间】:2012-04-03 03:09:38 【问题描述】:

我无法覆盖我在 Storyboard 中设计的 CustomViewController 的初始化方法。

现在我在做(在我的 mainViewController 中):

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

我有 viewDidLoad (CustomViewController)

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

这没问题。

但是,这是正确的方法吗?我应该向我的 CustomViewController 添加自定义初始化方法(或覆盖)吗?像 initWithObject: ?我不知道如何调用我的自定义 init 方法而不是 UIStoryboard instantiateViewControllerWithIdentifier:,而且我没有接到对 initinitWithNibName 的调用。

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

请给我一些建议!

谢谢!

【问题讨论】:

你做的一切都是对的。您可以在您的自定义类中覆盖 initWithCoder,即您的 _customViewController 对象的类文件以进行自定义初始化 【参考方案1】:

情节提要中视图控制器的指定初始化程序是-initWithCoder:。由于 Storyboard 中的大多数视图控制器都是通过 segue 创建的,因此您通常会在 -prepareForSegue:sender: 期间看到状态集。

如果您像在您提供的示例中那样直接从情节提要中实例化视图控制器,那么您选择的模式是合适的。

【讨论】:

很高兴知道我在做事! 这是一个非常糟糕的设计,因为它使您可以在 swift 中使用 Optionals(使用 !?),或者如果开发人员忘记设置正确的变量,则可以访问可能的 nils。遗憾的是,这是“适当”的解决方案:关于这个问题的一个很好的来源,带有 swift/objective c 可选:objc.io/issue-16/power-of-swift.html 只是为了回应@GuilhermeSilveira 评论,这个问题是从 2012 年开始的,当时 swift 甚至不为公众所知,即使是这样,Objective-C 和 Swift 之间的设计模式也大不相同,所以你如果你使用 Swift 开发,不应该坚持这种模式。 对于从 Storyboard 加载的 VC,Swift 是否有一种模式可以避免选项或隐式解包选项?【参考方案2】:

作为解决此问题的另一个“解决方法”,您可以使用委托。创建一个协议,该协议将充当故事板中 UIViewController 子类的数据源。符合这个数据源协议,在加载你的 UIViewController 子类后立即实现并使用它:

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

        //invoke your data source here
    

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

【讨论】:

以上是关于带有情节提要的 viewController 自定义初始化方法的主要内容,如果未能解决你的问题,请参考以下文章

带有情节提要的 viewController 自定义初始化方法

带有自定义单元格的 ViewController 内的 UITableView 没有情节提要

如何从 push segue 中解散带有情节提要的 viewController?

以编程方式将 UIButton 添加到带有情节提要的自定义 ViewController

我有一个带有不同/多个 UIView 的情节提要,并且我想要每个 UIView 都有一个 ViewController。迅速

每次我打开情节提要时视图错位