我正在尝试根据我的应用程序中的某些运行时条件动态加载UIStoryboard(然后在其中实例化视图控制器)
由于方法UIStoryboard(name: bundle:)
完全看起来可能会失败(即错误的文件名,在包中找不到等),我假设它返回类型为UIStoryboard?
的可选项。但是,编写此代码:
if let storyboard = UIStoryboard(name: "", bundle: nil) as? UIStoryboard{
// Use the storyboard...
}
...发出警告:
来自' UIStoryboard的条件演员'到' UIStoryboard'总是成功
因为它是初始化程序,所以内联文档中的方法签名(按方法' s name:
标签选项 - 单击)不会列出返回类型。
文档的实际网页(预发布,here)说:
返回值
指定文件的故事板对象。如果不 故事板资源文件匹配名称存在,抛出异常 描述:找不到名为' XXXXXX'的故事板在 捆绑....
(强调我的)。但是,尝试使用do-try-catch方法会给我一个警告:
在尝试'尝试'表达
那么,我该怎么处理失败?
答案 0 :(得分:3)
我认为Apple没有处理它。如果您想获得主要故事板并且您不知道其名称,可以尝试使用此代码。
if let mainDict = NSBundle.mainBundle().infoDictionary {
if let storyboardName = mainDict["UIMainStoryboardFile"] as? String {
let mainStoryBoard = UIStoryboard(name: storyboardName, bundle: nil)
}
}
希望这有帮助!
答案 1 :(得分:0)
我们也可以使用相同的扩展名(Swift 2.0)
public extension UIViewController {
public class func createInstanceFromStoryboardName(storyboardName: String, storyboardId: String) -> UIViewController? {
let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
let instance = storyboard.instantiateViewControllerWithIdentifier(storyboardId) as? UIViewController
return instance
}
}
然后在你的班级
if let myViewController = UIViewController.createInstanceFromStoryboardName("UIMainStoryboardFile", storyboardId: "ID_MYVIEWCONTROLLER") as? myViewController {
// Todo
}