nabetack blog

フリーエンジニアになろうとする人のブログ

画面遷移を個別のViewController内のソースコード埋め込みから解放させる (swift)

DIコンテナのように、外部ファイルに情報を記述して、遷移の更新・変更をソースから切り離す仕組みをswiftで実現させてみた。

1. 自身のクラス名を取得する
 インスタンス名から取る方法とクラスのファイル名から取る方法がある、が、

 インスタンス名から取ると、前後の書き方で、余分なものが付いてきたり、

 しなかったりする。、、、怖いのでブレないファイル名からにする

var fileName            = (__FILE__ as String).lastPathComponent

var range1              = fileName.rangeOfString(".")

var classNameF : String = fileName.substringToIndex(range1!.startIndex)


2. plistから情報を取得する

gPath = NSBundle.mainBundle().pathForResource("NavigationInfo", ofType: "plist")

gDict = NSDictionary(contentsOfFile: gPath!)

let nextScene : String = gDict?.objectForKey(selfName)?.objectForKey(way) as String

 

3. 文字列からクラスを生成する

var nextType    : NSObject.Type    = NSClassFromString( nextScene ) as NSObject.Type

var nextClass                      = nextType.alloc() as UIViewController

    nextClass.modalTransitionStyle = UIModalTransitionStyle.CoverVertical

self.presentViewController( nextClass, animated: true, completion: nil )

各画面ViewControllerの冒頭に下記を忘れずに

@objc(VidwControllerName)

 

どのように機能拡張をするか
クラス継承で実装するか、同じクラスに機能拡張させるか
この辺、どう分割して書くかによって、調節できる

  予想外にどちらも、自身のクラス名は取得できなかった。

 エクステンドでも継承でも自身のクラス名は取得できないようだ、元クラス(ファイル)名が取れる

  直接書く必要が有る(super init)

   -> やむをえず、同じコードをコピペする (いい方法はないものか)

 

 ちなみに、エクステンドでできるのは、メソッドだけ。変数はNG

  エクステンド、変数実装できませんでした。
「Extension may not contain stored properties」
  これなら、自作継承クラスにまとめた方がいいですね。