所以我的代码有效,但我收到警告:
Null传递给需要非空参数的被调用者
显然这是因为以下几行:
MyViewController *vc = [[MyViewController alloc] initWithCoder:nil];
MyViewController
是Swift
类。我已经在其中实现了所需的initWithCoder
方法。
我的问题很简单 - 我会将哪个参数传递给initWithCoder
以取消警告或我使用哪种替代init
策略?
注意:视图控制器I初始化是用Swift编写的。然而,我从Objective-c类初始化它。
答案 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方法,然后执行任何特定于类的初始化。
一般情况下,不要编写复杂的初始化方法。相反,实现一个简单的初始化方法,然后为视图控制器的客户端提供属性以配置其行为。