在Swift2中运行时实例化UIStoryboard,如何处理失败?

时间:2015-08-12 02:48:19

标签: ios uistoryboard swift2 ios9

我正在尝试根据我的应用程序中的某些运行时条件动态加载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方法会给我一个警告:

  

在尝试'尝试'表达

那么,我该怎么处理失败?

2 个答案:

答案 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
}