画面遷移を個別の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」
これなら、自作継承クラスにまとめた方がいいですね。
ジェスチャーの併用はどこまでいけるか (swift)
swipe ( 右,左,上,下 ) とtap ( 1回,2回,3回 ) を同時にセットしたら、
両方呼ばれてしまうのか?
どちらか一方か?
種類の判別が効いていて、排他選択になるか?
tap1回とtap2回,,, を同時にセットしたら
両方よばれるのか?
結論:
ジェスチャーの併用では、
種類は分けられるが、タップ回数は全部呼ばれる
(swift) UIViewControllerの継承クラスで、initにてつまずく
init()にて ビルドエラーに苦しむ
メンバ変数の定義の仕方によって、initの定義の仕方が変わってくるみたいだ
これはややこしい。ちょっと変えたらビルドエラーになってしまう。
とりあえずの解決方法
やりたいのは、alloc initのタイミングで実行したい内容だろうか?
そうでないなら、無理に呼ばないのがよさそうだ。
viewDidLoadの冒頭でも問題がない。
ちなみに、メンバ変数の初期値もここでセットすれば、
初期値の入力がないエラーメッセージは無くなる
(まだまだ swiftの修行が足りんな)
本のブログ見つけた。
みんなどんな本を読んでいるのか?
エンジニアたるもの、本を読んで勉強もしなくては
ここに記録していくのも悪くない。
(最近読んだ、仕事に関連した本だけに統一しておくと
よさそうだ。
ちなみに、人の読書ブログをみると、
こんなこと勉強しているんだと、インスパイアされる
http://bookmeter.com/u/15125
同じようなことに興味を持っている仲間が見つかるかも
SwiftでUIViewのアニメーション
以前もBlocksで入れ子ななるアニメーションを作っていたけど、
最近はUIViewクラスでメソッドを用意したみたい。
基本は変わらない
cocos2dみたいにアニメーションをつなぐ書き方がシンプルだといいんだけど
もしくはjQueryみたいな"."ドットで記載していけるとか
UIView.animateWithDuration( 0.6, delay:0.0, usingSpringWithDamping:1.0, initialSpringVelocity:10, options:nil,
animations:
{
self.btn0.bounds = CGRectMake( bBounds.origin.x, bBounds.origin.y, bBounds.size.width, bBounds.size.height )
self.btn0.backgroundColor = UIColor.grayColor()
self.btn0.alpha = 1.0
},
completion:nil
)
usingSpringWithDamping ... バネのような反動の設定(ボヨンボヨンするか)
initialSpringVelocity ... 実行速度のようなものと認識(大きいほど急)
()内の引数はいろいろ引数がかえられるようだ。
swiftばかり調べてるけど、最近の案件ってまだObjective-Cが主流だったりするのかな?