问题描述
我想实例化我创建的情节提要的根视图控制器。
为此,我习惯从情节提要中调用-instantiateInitialViewController()
。
问题是,自iOS13起,有一个新方法签名采用了新的可选参数:(creator: ((NSCoder)->ViewController?)?)
恼人的是Xcode认为我想使用新的API,这使我的应用程序与旧版OS不兼容。
即使进行了版本检查,我也无法解决它。
我的问题是:如何告诉编译器使用不带参数的方法签名?
解决方法
您的问题的快速解答:Xcode错误
首先,如您的屏幕快照所示,这是一个错误。 (尝试删除驱动数据或重新启动内容以使其正常工作)。以下是您问题的答案。
说明:如何告诉编译器使用哪个方法签名
Swift根据表达式中使用的Type推断函数签名。想象一下:
class ViewController { }
class UIViewController { }
func instantiateInitialViewController() -> UIViewController? {}
func instantiateInitialViewController() -> ViewController? {}
因此称此为 instantiateInitialViewController()
的含糊用法:
let theController = instantiateInitialViewController()
解决方案是告诉编译器明确的预期类型:
let theController: ViewController? = instantiateInitialViewController()
let theOtherController: UIViewController? = instantiateInitialViewController()
新的instantiateInitialViewController
返回类型是约束为ViewController
的协议(UIViewController
)。因此,它应该推断类型,并且与旧类型没有逻辑差异。因此,请保持冷静,并让其推断出;)
好吧,这显然是Xcode的一个错误。
重新启动Mac后,它可以正常工作。
我为什么认为错误可能来自我……?️
谢谢大家!
,实际上,我不知道您的问题的答案,但是也许您只想从Storyboard for iOS 13.0以下版本初始化ViewController?试试这个:
UIStoryboard(name: "storyboardName",bundle: nil).instantiateViewController(withIdentifier: "ViewControllerID")
,
UIViewController对象可以保存到磁盘并根据请求进行恢复(例如,电池电量不足,内存警告问题)。
新的iOS13方法
instantiateInitialViewController { (coder:NSCoder) -> MyViewController? in
return MyViewController(coder: coder)
}
允许视图控制器实例通过恢复其某些状态而栩栩如生。
此方法调用在MyViewController中调用initWith(coder :),在此示例中,可以恢复“名称”属性。
class MyViewController: UIViewController {
var name:String?
required init?(coder: NSCoder) {
name = coder.decodeObject(forKey: "name") as? String
super.init(coder: coder)
}
}