頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


UIViewでのアニメーションが警告ばかり?!

viewやボタンを簡単にアニメーションできるとは聞いていたのですが、へんてこなところで躓いていました。

UIViewで手軽にアニメーションを実行する方法 - プログラミングノート

↑基本的なコードはこのあたりが参考になるかと。

ところが、自分のテスト用プロジェクトで実際にやってみると、なぜか
'HogeView' may not respond to '-beginAnimations: context:'
というような警告ばかり出て全然動いてくれない。

なんでだろう?
とさんざん悩んだあげく、気がついたのが、このあたりのメソッドはクラスメソッドである!!!
ということ。

つまり、
[UIView beginAnimations:nil context:context];
↑このようにすべきところを

[hogeView beginAnimations:nil context:context];
↑このようにしていたのです。

てっきり、アニメーションさせたいオブジェクトのメソッドを使うのかと勘違いしていたわけです。
ここでhogeViewは動かしたいUIViewのオブジェクトだったり、動かしたいオブジェクトを乗せたUIViewのオブジェクトだったり、、、まあいろいろ試行錯誤していたのです、、、もちろんうまく行かないわけで。
なんとも、時間を無駄に使いました。


UISegmentedControlで位置、サイズを設定する方法

UISegmentedControlクラスを使おうとしました。

UISegmentedControlのオブジェクト
↑こういう選択できるボタンみたいなやつですね。

いざやろうとして困ったのがこのオブジェクトの位置を決める方法。
もちろん、Interface Builderなしです。

UISegmentedControlクラスを使う場合、基本的な流れはこんな感じになるかと。
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:nil];
[segmentedControl insertSegmentWithTitle: @"Male" atIndex: 0 animated: NO ];
[segmentedControl insertSegmentWithTitle: @"Female" atIndex: 1 animated: NO ];       
[segmentedControl addTarget:self action:@selector(segmentAction:)  forControlEvents:UIControlEventValueChanged];
[cell addSubview:segmentedControl];
[segmentedControl release];
cellってのからもわかるかもしれませんが、これはtable viewの行に表示する場合。
しかしこれだと、このオブジェクトは行の左端に表示され、位置をコントロールできません。
いろいろと方法はあるのでしょうけど、とりあえず初期化時にこんなので実装しました。
//UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:nil];
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithFrame:CGRectMake(130, 8, 160, 30)];
UISegmentedControlクラスのリファレンスを見ると、初期化はinitWithItems:が記載されてますが、UISegmentedControlの親の親であるUIViewクラスで定義されてるinitWithFrame:で初期化しています。
これで、サイズ、位置を設定することができました。


applicationWillTerminate: が呼ばれない理由

バカバカしいところで躓いてました。
あるテスト中のアプリで、どういうわけか applicationWillTerminate: が呼び出されないのでその原因を必死にさがしていたのです。
この前までは確実に呼び出せていたのです。
というのも、この applicationWillTerminate: 内で保存処理をやっているので、ここが呼び出されないとすぐに「ありゃ?おかしいぞ?」とわかるわけです。

applicationWillTerminate: が呼び出されないということは、きっと他のオブジェクトを破棄する時点でとぼけたコードを書いているために、落ちているんだろうといろいろとチェックしたり、、、
ごくシンプルなコードで動作チェックしたり、、、
以前、動いていたはずのコードでチェックしたり、、、

ようやくたどり着いた結論は、これがiOS4のマルチタスクというもの、です。

ほれ、この前我が iPhone3GSに入れたiOS4。
マルチタスクができるようになりましたよね(正直それほど恩恵を感じなかったりしますが)。

私はてっきり、ホームボタンを押すと今まで通りアプリは終了して、ホームボタンを2度押ししてコントロールするとバックグランドで動いたりするのかな、って思っていました。
ところが、どうやら違ったようです。

ホームボタンを押してアプリを終了してもアプリは完全に終わってるわけじゃなくて、サスペンド状態になってるらしい。
ホームボタンの2度押しとか関係なく、再度アプリを起動(普通はアイコンにタッチだよね)すると、最初からアプリが起動するんじゃなくて、サスペンド状態から復活するみたい。

自分の書いたコードのあっちこっちにNSLogでどのメソッドが呼ばれているのかを確認したところ、
ホームボタンを押しても applicationWillTerminate: は呼ばれない。
代わりに applicationDidEnterBackground: が呼ばれる。
サスペンド状態から復活する時には、applicationWillEnterForeground: が呼び出される。

そういうことか~!
なお、実機ではなく、あくまでiPhoneシミュレーター上での結果です。




#pragma markなんてあるんだな

Xcodeでクラスファイルを作成すると、ファイルの途中に
#pragma mark -
#pragma mark Memory management
なんて記述があったりしますよね。

なんじゃいな、これ、、、?
と思って調べると、こんな記事が。

(旧) Cocoaの日々: Xcode の #pragma mark とは何か ?

これで、お目当てのメソッドを探しやすくできるわけか。
試しにやってみたところ、日本語も使えました。

pragma mark

こりゃいいね!


メモが勝手にネットにアクセスしてる?

iOS4を入れてから標準のメモアプリがなにやらネットにアクセスしているみたい、、、?

標準メモアプリ

↑画面上部の扇形と時刻の間にくるくるまわるネットにアクセス中ですよんという表示が見えるのです。

なんで、メモがネットにアクセスするんだ?
と思ったらどうやら仕様が変わったようで。

なんでもGmailなどと同期できるようになったとか。
うん、確かにGmailで確認したら、メモの内容が表示されとるがな!

便利になったようだけど、、、その機能は使わないな。

上の画像のように、メモアプリは外出先で買い物メモに普段使っています。
なるべくWi-Fiが使えないところでのネットへの接続は控えているので、このメモアプリがネットにアクセスするのをやめさせようとしたのですが、試行錯誤するもよくわからず、結局Google先生のお世話に。

apptoi - iPhoneあっぷ使ってみた: iOS 4使ってみた - メモ、一覧とメールで同期
↑助かった。

メモの設定が、
設定>メール/連絡先/カレンダー
ってところにあるとは意表を突きますね。




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad