UIStoryboardからUIViewController取得する過程で間違ったStoryboard名を渡して落とさないためのUIViewControllerExtension


概要

UIStoryboardインスタンス生成時に存在しないStoryboardファイルの名前を渡すと NSInvalidArgumentExceptionが発生します。

そもそも渡す名前を間違えなければ問題ないのですが、気になったので安全な方法が無いか調べてみました。

方法

stackoverflowにありました。😃

NSBundle.mainBundle().pathForResource("StoryboardName", ofType: "storyboardc") でStoryboardのパスがあるかを確認すればいいみたいです。


import UIKit

extension UIViewController {

    public class func safetyDestinationViewController(storyboardName: String) -> UIViewController? {

        guard let _ = NSBundle.mainBundle().pathForResource(storyboardName, ofType: "storyboardc") else{
            return nil
        }

        let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
        guard let vc = storyboard.instantiateInitialViewController() else{
            return nil
        }

        return vc
    }
}

viewControllerのstoryboardIDも指定できるようにしたい所ですが、instantiateViewControllerWithIdentifierメソッドに間違ったIDを渡して落ちるときの対処方法がわかりませんでした。。。

参考

Instantiate UIStoryboard at runtime in Swift2, how to handle failure?