UITextField で表示するキーボードは Storyboard で設定できる

UITextField で表示する keyboard は、code から設定するものだとばかり思っていたのですが、Storyboard からも設定できることを今日知った・・・

UITextField を選択し、Show the Attributes Inspector を選択、Text Input Traits の中に、Keyboard Type という list があり、keyboard を指定できる。

せっかくなので、この方法でしばらくやってみよう。

ちなみに、keyboard type を number pad にして、数字の keyboard を出せば、数字しか入力できないのかと思ったら、そう甘くはない。copy & paste すると相変わらず alphabet も paste できてしまうので、入力文字制限のための delegate method で別途に書かないとならない。

 

navigationController の delegate method

Detail から detailDetail に画面遷移し、navigation ボタンで Detail に戻ってくる時 delegate method はないのか? 事の発端は、戻ってきたとき tableView の内容が更新されない事態で困ったなと。

調べてみたらちゃんとあった。Detail に戻ってきた後に呼ばれる method は以下の通り。

- (void) navigationController:(UINavigationController *) navigationController

        didShowViewController:(UIViewController *) viewController

                     animated:(BOOL)animated

Detail の class で <UINavigationControllerDelegate> を宣言し、

viewDidLoad あたりで self.navigtionController.delegate = self; とし、

上記 method を実装すると呼ばれる。

便利だね。

Segue の kind で指定できる内容の違い

Segue 接続して次の画面に遷移する場合ですが、Attributes Inspector を表示すると、kind とというリストがあり、そこで画面をどのように表示するか指定できる。

遷移したら navigation Item が表示されなくなったぞ?と思っていたら、Show あるいは Show Dtail を指定しないとならないのに、Present (series) を選んでいたことが原因だったということが分かりました。

ところで、Show と Show Detail の違いは一体何なのだ?という新たな疑問が生まれました。どちらを指定しても、動作的には変わらないのですが?遷移する時、例えば、一方が左から右、一方は下から上のように分かりやすい形だと良かったのですが、そうではないので一層???

調べてみたところ、iPhone では画面が小さいのでどちらも同じ動作になりますが、iPad の場合、split view のように分割して画面提示する形を考慮すると、一方にリスト、一方に detail を表示するような提示の仕方ができるのが Show Detail ということが分かりました。

なるほど、と。iPad での検証は少し先なのですが、今はとりあえず、Show Detail にしておこう。

UISwitch の反転

UISwitch の変更があった場合、値をどうやって設定するか。現在の値は property on で取得できます。mySwitch.on のような形です。現在の値を取得できることから、if 文で分岐するやり方を思いついたのですが、あまりスマートではないなぁと・・・こんな感じ。

if ( mySwitch.on )

{

    mySwitch.on = NO;

}

else

{

    mySwitch.on = YES;

}

よい方法はないかと調べたら、こんなやり方があった。

mySwitch.on = !mySwitch.on;

これいいね。

Class method と Instance method について

アプリを作っていて、画面ごとに(というか ViewController ごとに)source が分かれるのですが、あ、この method 前の画面でも使ったなぁということがあります。今回遭遇したのは、field に数字を入力したら自動的にカンマをつける、データを保存するときは、カンマを取ってから保存するというような method が必要になりました。どちらの ViewController にも同じ method を定義してももちろんよいのですが、MyUtilities のようなClass を新設し、そこに書いたほうが将来の保守性はよい訳です。

というわけで、Class を新設して method を定義していったのですが、そういえば、Instance method と Class method があったなと。定義する時、頭が - なら Instance method で、+ なら Class method になります。この違いですが、O'reilly の本などを読んでも今ひとつピンとこないのですが、Class method の方が code を書く時に便利です。Instance method では次のようになります。

MyUtilities* hoge = [[MyUtilities alloc] init];

[hoge someMethod:variables];

これを Class method として定義してある場合は、インスタンスを生成する必要がないので、一行で書けてしまうと。

[MyUtilities someMethod:variables];

それで、Class method は一体何の役に立つのだ?ということなんですが、refactoring の時が一番メリットを感じます。例えば、同じ class 内に method を定義していて、この method を別の class に定義したとすると、code は次のように変更することになります。

変更前:[self someMethod:variables];

変更後:[SomeClass someMethod:variables];

つまり、self の部分だけ変えればよいのです。これが、instance method だった場合は、かなり面倒なことになります。

SomeClass* hoge = [[SomeClass alloc] init];

[hoge someMethod:variables];

一行では到底書けません。

実は、Class method の方が、定義する時にめんどくさいこともあったりするのですが、クラスのインスタンスを生成しなくてもよいのでコードを減らすことができる、あるいは refactoring の際に簡単に直せるというのが一番の利点なのかなと思いました。

 

UIProgressView にハマる・・・

あるフィールドに値を入れたら、UIProgressView の表示も更新したいと思い、

・アニメーションなしなら、progressView.progress = xx;

・アニメーションありなら、[progressView setProgress:xx animated:YES];

アニメーションの有無を指定できるところが、iOS っぽくていいよね、楽勝・楽勝!と思っていたら思いっきりハマった・・・

理由は、フィールドの値をもとにして最新の値を使って progress の値を指定する必要があったのだが、計算に保存してある初期値を使っていたので結局のところ値を更新したつもりが更新されていなかった、progress の値が変更されていないので見た目の変化がないという結果に・・・

それに気づくまで結構時間がかかって、dispatch だの main_thread で実行しているからか?とか、画面に対して needsUpdate が必要か?などいろいろ試して全く変化がないので散々悩みましたが、理由がわかればなるほど、と。

あー、かなり疲れた・・・

トレイルランニング:愛宕山ー吾国山、縦走

今日は休みだったのでいつもの縦走コースでトレーニング。

朝五時半に起きて、岩間駅に着いたのが 0730 頃。最近寒いのでウエアが心配だったのですが、ジオライン+R1 の上にウインドブレーカーで、歩くと寒いけれども走り始めたらちょうど良い感じになりました。道中、下りの日陰ではやや寒いものの、運動を続けられるぐらいで、よかったです。

トレイルは冬なので周辺の草がなく、道中はいつもと違うように感じました。また、空気が澄んでいるので景観は素晴らしかったです。落ち葉ば多く、所々滑るので慎重に。このコース、登山道入り口から終始傾斜がきついと思うのですが、今回も傾斜がきついと感じました。登りも下りもあまりスピードが出せない。でも、決して歩かないと決めていたので、途中立ち止まって休んだものの走りきりました。今回は人にあったのは一人だけ。年末ですしあまり人が来ないのでしょうかね、この季節は景色が良いのでおすすめなんですが。

水戸線は確か 25 分発じゃないかと思い、一般道ではペースアップ。福原駅に着いたのが 1025、水戸線は 1019 発で、1055 まで待つ羽目に。風が吹いていなくて、太陽が出ているのでポカポカして暖かかったです。前回は確か、宍戸駅からはなさかまでヘロヘロになりながらだった気がしますが、今回は脚に随分余裕があって、楽々到着。そういえば水分も吾国山で 500ml 飲んだきり。気温が低いと疲れが少ないのか、あるいは普段のインターバル走の成果なのか。

はなさかで一風呂浴びて、さあ昼飯だと思ったら、食堂はいつもはあまり人がいないのですが今回は主に老人がたくさんいて、ステージを使ってカラオケ大会の様子。忘年会かなんかですかね。皆さん持ち歌があって、演歌中心に歌っていました。演歌じゃない曲が一曲だけあって、これなんだっけと思っていたらサビの部分で分かりました。イミテーション・ゴールド。うわこれなつかしいな、久々に聞きました。

お土産はいつもの吉原殿中を買ってきました。

また春に行ってこよう。

===翌日追記

朝起きたら、モモの前面が筋肉痛で辛い・・・