在Swift中初始化视图控制器

时间:2015-05-05 13:59:01

标签: ios swift

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

  

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

显然这是因为以下几行:

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

MyViewControllerSwift类。我已经在其中实现了所需的initWithCoder方法。

我的问题很简单 - 我会将哪个参数传递给initWithCoder以取消警告或我使用哪种替代init策略?

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

2 个答案:

答案 0 :(得分: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:方法

答案 1 :(得分:1)

鉴于您的视图控制器没有笔尖或故事板,您不应该在Swift中使用initWithCoder。请注意UIViewController文档中的这些信息:

<强>讨论

这是此类的指定初始值设定项。

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

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

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

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

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

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

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