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」
  これなら、自作継承クラスにまとめた方がいいですね。

ジェスチャーの併用はどこまでいけるか (swift)

swipe ( 右,左,上,下 ) とtap ( 1回,2回,3回 ) を同時にセットしたら、

両方呼ばれてしまうのか
どちらか一方か
種類の判別が効いていて、排他選択になるか


tap1回とtap2回,,, を同時にセットしたら
両方よばれるのか?

結論:
ジェスチャーの併用では、
種類は分けられるが、タップ回数は全部呼ばれる

(swift) UIViewControllerの継承クラスで、initにてつまずく

init()にて ビルドエラーに苦しむ

メンバ変数の定義の仕方によって、initの定義の仕方が変わってくるみたいだ
これはややこしい。ちょっと変えたらビルドエラーになってしまう。

とりあえずの解決方法
やりたいのは、alloc initのタイミングで実行したい内容だろうか?
そうでないなら、無理に呼ばないのがよさそうだ。
viewDidLoadの冒頭でも問題がない。
ちなみに、メンバ変数の初期値もここでセットすれば、
初期値の入力がないエラーメッセージは無くなる
(まだまだ swiftの修行が足りんな)

本のブログ見つけた。

みんなどんな本を読んでいるのか? 
エンジニアたるもの、本を読んで勉強もしなくては
ここに記録していくのも悪くない。
(最近読んだ、仕事に関連した本だけに統一しておくと
よさそうだ。
ちなみに、人の読書ブログをみると、
こんなこと勉強しているんだと、インスパイアされる
http://bookmeter.com/u/15125
同じようなことに興味を持っている仲間が見つかるかも

Swiftのエラー Cannot invoke '〜' with an argument list of type '〜'

swiftにて、自動配置のプログラムなどを書いていて、数値の計算式で謎のエラー
Cannot invoke '〜' with an argument list of type '〜'
引数の組み合わせで実行できないのでエラーになっていたらしい
+-/%*の演算子でも起こる。

swiftは変数の型を省略できるけど、このエラーが出たときは、
一旦全てに型を明記して消えるか確かめるのはどうだろう。

これから計算式には必ず型を省略せずに書くことにしようっと

一番はじめに書いたプログラムを見直して書き直してみる

随分前の話だけど、まだエンジニアでないときに、100ます計算の練習用のプログラムを作成した。
未だにたまに脳トレとして使ってます。何か節目に感じ、いい機会なので書き直してみることにした。
繰り返すところを手で全部書いて、力技だったりした
HTMLダグとScriptの連携だったけど、
タグ要素の生成も実はスクリプトで作れたり

学びて時にこれを習う、またたのしからずや

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が主流だったりするのかな?