web-dev-qa-db-ja.com

アプリのメインストーリーボードをプログラムですばやく参照するにはどうすればよいですか?

アプリのメインストーリーボードをプログラムですばやく参照するにはどうすればよいですか?参照のためにアプリのデリゲートを調べましたが、今のところ見つかりません。

13
Daniel K.

おっと、私は答えを見つけました...

ストーリーボードに接続されているの別のビューコントローラーでは、次のように簡単に使用できます。

self.storyboard?
19
Daniel K.

または、オブジェクトは名前とバンドルを参照することでストーリーボードを取得できます。

let storyboard = UIStoryboard(name: "storyboardNameHere", bundle: nil) //if bundle is nil the main bundle will be used
14
Mario

それは簡単です。同様の問題に遭遇したとき、メインバンドルからリソースを取得できるクラスを作成しました。

//Generate name of the main storyboard file, by default: "Main"
var kMainStoryboardName: String {
    let info = NSBundle.mainBundle().infoDictionary!

    if let value = info["TPMainStoryboardName"] as? String
    {
        return value
    }else{
        return "Main"
    }
}

public class TPBundleResources
{
    class func nib(name: String) -> UINib?
    {
        let nib = UINib(nibName: name, bundle: NSBundle.mainBundle());
        return nib
    }

    //Main storybord
    class func mainStoryboard() -> UIStoryboard
    {
        return storyboard(kMainStoryboardName)
    }

    class func storyboard(name: String) -> UIStoryboard
    {
        let storyboard = UIStoryboard(name: name, bundle: NSBundle.mainBundle())
        return storyboard
    }

    //Obtain file from main bundle by name and fileType
    class func fileFromBundle(fileName: String?, fileType: String?) -> NSURL?
    {
        var url: NSURL?

        if let path = NSBundle.mainBundle().pathForResource(fileName, ofType: fileType)
        {
            url = NSURL.fileURLWithPath(path)
        }

        return url
    }

    class func plistValue(key:String) -> AnyObject?
    {
        let info = NSBundle.mainBundle().infoDictionary!

        if let value: AnyObject = info[key]
        {
            return value
        }else{
            return nil
        }
    }
}


public extension TPBundleResources
{
    //Obtain view controller by name from main storyboard
    class func vcWithName(name: String) -> UIViewController?
    {
        let storyboard = mainStoryboard()
        let viewController: AnyObject! = storyboard.instantiateViewControllerWithIdentifier(name)
        return viewController as? UIViewController
    }

    class func vcWithName(storyboardName:String, name: String) -> UIViewController?
    {
        let sb = storyboard(storyboardName)
        let viewController: AnyObject! = sb.instantiateViewControllerWithIdentifier(name)
        return viewController as? UIViewController
    }

    //Obtain view controller by idx from nib
    class func viewFromNib(nibName: String, atIdx idx:Int) -> UIView?
    {
        let view =  NSBundle.mainBundle().loadNibNamed(nibName, owner: nil, options: nil)[idx] as! UIView
        return view
    }

    class func viewFromNib(nibName: String, owner: AnyObject, atIdx idx:Int) -> UIView?
    {
        let bundle = NSBundle(forClass: owner.dynamicType)
        let nib = UINib(nibName: nibName, bundle: bundle)
        let view = nib.instantiateWithOwner(owner, options: nil)[idx] as? UIView
        return view
    }

    class func viewFromNibV2(nibName: String, owner: AnyObject, atIdx idx:Int) -> UIView?
    {
        let view =  NSBundle.mainBundle().loadNibNamed(nibName, owner: owner, options: nil)[idx] as! UIView
        return view
    }
}

以下に簡単な例を示します。

//Get a main storyboard
TPBundleResources.mainStoryboard()

//Get view controller form main storyboard
TPBundleResources.vcWithName("MyViewController")

//Get view from MyView.nib at index 0
TPBundleResources.viewFromNib("MyView", atIdx: 0)

//Get plist value by key
TPBundleResources.plistValue("key")
8
tikhop

@ManOfPandaの答えが正しい場合でも、UIViewControllerへの参照がない場合があるため、rootViewControllerUIWindowから取得できます。 AppDelegateのオブジェクト。

_// First import your AppDelegate
import AppDelegate

// ...

// Then get a reference of it.
let appDelegate = UIApplication().shared.delegate as! AppDelegate

// From there, get your UIStoryboard reference from the
// rootViewController in your UIWindow
let rootViewController = appDelegate.window?.rootViewController
let storyboard = rootViewController?.storyboard
_

もちろん、(@ Marioが提案するように)を使用してUIStoryboardを作成することもできます。

_let storyboard = UIStoryboard(name: "storyboard", bundle:nil)
_

Appleのドキュメントによると、それでストーリーボードの新しいインスタンスが作成されます(すでに機能している場合でも)。私は常に既存のインスタンスを使用することを好みます。

init(名前:バンドル:)

指定されたストーリーボードリソースファイルのストーリーボードオブジェクトを作成して返します。

init(name: String, bundle storyboardBundleOrNil: Bundle?)

パラメータ

  • name:ファイル名拡張子なしのストーリーボードリソースファイルの名前。このパラメーターがnilの場合、このメソッドは例外を発生させます。
  • storyboardBundleOrNil:ストーリーボードファイルとその関連リソースを含むバンドル。 nilを指定すると、このメソッドは現在のアプリケーションのメインバンドルを検索します。

出典:Appleドキュメント

7
Alejandro Iván
UIStoryboard * mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
0
Peter Lapisu