紹介したい料理店のブログ

紹介したい料理店( https://ssrt.jp )のブログ

【swift】classを呼び出して、interface builderを開く(nibNameを使わずに)

ニーズはないと思います。 忘備録です。

行うことは下記。

  1. classを指定して呼び出す

  2. 呼び出し先のclass名とxibファイル名を同じにする

前提

target名:Test

swift class名:SwiftViewController

1.classを指定して呼び出す

swiftのclassはObjective-Cと違い、名前空間を指定しないといけないです。

swift名前空間はモジュール名(target名)なので、今回は、Test.SwiftViewControllerがclass名となります。 また、class名は下記のような形式での呼び出しも可能です。

_TtC<プロジェクト名の文字数><プロジェクト名><クラス名の文字数><クラス名>

今回の場合は、_TtC4Test19SwiftViewControllerとなります。

        println(NSClassFromString("SwiftViewController")) //nil
        println(NSClassFromString("Test.SwiftViewController")) //Test.SwiftViewController
        println(NSClassFromString("_TtC4Test19SwiftViewController")) //Test.SwiftViewController

呼び出し

        var testSwiftAnyObjectType: AnyObject.Type = NSClassFromString("Test.SwiftViewController")
        var testSwiftNSObjectType: NSObject.Type = testSwiftAnyObjectType as! NSObject.Type
        var testSwift: AnyObject = testSwiftNSObjectType()
        self.presentViewController(testSwift as! UIViewController, animated: true, completion: nil)

2. 呼び出し先のclass名とxibファイル名を同じにする

呼び出されたclassと同じ名前のxibファイルが存在している場合、自動でそのファイルを読み込もうとします。 これはswiftも同様です。 ただし、swiftの場合、前述のとおり、Test.SwiftViewControllerがclass名となってますので、 xibファイルをTest.SwiftViewController.xibとすることによって、自動でファイルが読み込まれます。

ちなみに、 呼び出されるfile側で、

@objc(SwiftViewController)
class SwiftViewController {
...
}

とすることによって、xibファイル名をSwiftViewController.xibとすることができますが、このクラスは名前空間に属さなくなります。

また、target名内のアルファベット文字以外は、_(アンダーバー)に書き換えないといけないと気をつけましょう。

参考にさせていただいた記事

http://anton0825.hatenablog.com/entry/20140422/1406165310

http://tsuchikazu.net/swift_namespace/

http://blogios.stack3.net/archives/190

http://bit.ly/1HJOrVr

http://techlife.cookpad.com/entry/2014/12/02/105513