【swift】classを呼び出して、interface builderを開く(nibNameを使わずに)
ニーズはないと思います。 忘備録です。
行うことは下記。
classを指定して呼び出す
呼び出し先の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/