【问题标题】:Initialising a view controller in Swift在 Swift 中初始化视图控制器
【发布时间】:2015-05-05 13:59:00
【问题描述】:

所以我的代码有效,但我收到警告:

Null 传递给需要非空参数的被调用者

显然这是因为下面这行:

MyViewController *vc = [[MyViewController alloc] initWithCoder:nil];

MyViewController 是一个 Swift 类。我已经在其中实现了所需的initWithCoder 方法。

我的问题很简单——我应该将什么参数传递给initWithCoder 来消除警告,或者我使用什么替代init 策略?

注意:我正在初始化的视图控制器是用 Swift 编写的。然而,我正在从一个 Objective-c 类初始化它。

【问题讨论】:

  • 你的标题和标签是Swift,而你的代码是Objective-C
  • 你能澄清一下这个问题吗?您说您在 Swift 中初始化了一个视图控制器,并展示了使用 Objective-c 进行初始化的代码。在任何一种情况下,文档都声明了 init coder -“返回从给定 unarchiver 中的数据初始化的对象。(必需)”您没有在 Objective-c 中提供编码器。您可能还会收到与需要在 Swift 类之前添加 @objc 相关的错误。
  • 进行了编辑以澄清。

标签: ios swift


【解决方案1】:

你应该以不同的方式来做。如果你使用storyboards:

UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:identifier];

如果storyboard 不同

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];

或来自xib

MyViewController *controller = [[MyViewController alloc] initWithNibName:nibName bundle:nil];

或者如果它完全来自代码:

MyViewController *controller = [[MyViewController alloc] init];

同时从您的代码中删除 -initWithCoder: 方法

【讨论】:

  • 感谢您的回答。视图控制器是在代码中创建的(没有 Storyboard 或 Xib)。此外,虽然 VC 是用 Swift 编写的,但我需要从 Objective-c 启动它。您的最终解决方案将如何用 Objective-C 编写?我试过vc = [[MyViewController alloc] init],但我遇到了崩溃。
  • 你遇到了哪次崩溃?
  • 我又试了一次,当我还从控制器中删除了 initWithCoder 方法时,它就起作用了。如果您更新答案以表明您的最终解决方案 + 从 VC 中删除 initWithCoder 方法有效,我会将其标记为正确。
【解决方案2】:

鉴于您的视图控制器没有 nib 或情节提要,您不应该在 Swift 中使用 initWithCoder。请注意 UIViewController 文档中的此信息:

讨论

这是该类的指定初始化程序。

您指定的 nib 文件不会立即加载。它在第一次访问视图控制器的视图时加载。如果您想在加载 nib 文件后执行额外的初始化,请覆盖 viewDidLoad 方法并在那里执行您的任务。

如果为 nibName 参数指定 nil 并且不覆盖 loadView 方法,则视图控制器会使用其他方式搜索 nib 文件。请参阅 nibName。

如果您的应用使用情节提要来定义视图控制器及其关联视图,则您的应用永远不会直接初始化该类的对象。相反,视图控制器要么由故事板实例化,要么在触发 segue 时由 iOS 自动实例化,要么在您的应用程序调用故事板对象的 instantiateViewControllerWithIdentifier: 方法时以编程方式实例化。当从故事板实例化视图控制器时,iOS 通过调用它的 initWithCoder: 方法来初始化新的视图控制器。 iOS 自动将 nibName 属性设置为存储在故事板中的 nib 文件。

有关视图控制器如何加载其视图的更多信息,请参阅视图控制器中的资源管理。

以下是资源管理关于以编程方式初始化的内容。

以编程方式初始化视图控制器 如果视图控制器以编程方式分配其资源,请创建特定于视图控制器的自定义初始化方法。此方法应调用超类的 init 方法,然后执行任何特定于类的初始化。

一般来说,不要编写复杂的初始化方法。相反,实现一个简单的初始化方法,然后为视图控制器的客户端提供属性以配置其行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    相关资源
    最近更新 更多