2011年7月27日水曜日

UITableVIewのセルの色を変えたい

UITableViewのセルの色を変えたり、透過させたい、という比較的稀な(?)ことをやってみたいことがありますが、単純にbackgroundColorを指定しても反映されません。
独自のセルを用意した場合も同様で、いくらInterfaceBuilder上で色を設定してみてもテーブルに表示されるころには白くなっています。
これはUITableViewが強制的に色を統一してくるからです。

色を変えるためにはセルを描画する直前に呼ばれるtableView willDisplayCellをオーバーライドしてやります。


- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
 if (indexPath.row % 2) {
  cell.backgroundColor = [UIColor colorWithRed:0.9 green:0.9 blue:0.9alpha:1.0];
 }
}

例えばこんな風にしてやれば一行おきにちょっと暗い色にできます。

2011年7月25日月曜日

UIImagePickerControllerでカメラを表示するとViewが破棄される

とある画面からUIImagePickerControllerをカメラモードで起動した後に戻ってくると、その画面が初期化されてしまう、ということがあります。
ユーザー操作で設定情報を覚えていたのにカメラから戻ってきた途端に初期化されて忘れてしまう、ということになってしまう困ったぞ、と。

このときデバッグで起動するとコンソールに「Received memory warning」というメッセージが出ていて、これはメモリ警告が発生したことを表しています。メモリを使い過ぎ、ということなのでiOSはviewを破棄してしまいます。なので、カメラから戻って来たときにviewの生成から始まってしまい初期化されてしまう、という現象。

メモリ警告は「didReceiveMemoryWarning」というメソッドで通知されるので、ここで必要な情報は別領域に退避してやって、再生成時に復元してやる必要があります。

2011年6月12日日曜日

MGTwitterEngineでタイムラインが20件ずつ固定になる

MGTwitterEngineの問題点2つめ。
タイムラインを読み出すときに使う「getFollowedTimelineSinceID」メソッドですが、パラメータのcountは本来何件よみだすかを指定するものですが、いくつ指定しても常に20件固定で返ってきます。

以下のようにして直します。

「SA_OAuthTwitterEngine.m」に「_sendRequestWithMethod」というメソッドがあるので、この中に

// --------------------------------------------------------------------------------
// modificaiton from the base clase
// the base class appends parameters here
// --------------------------------------------------------------------------------
//if (params) {
//fullPath = [self _queryStringWithBase:fullPath parameters:params prefixed:YES];
//}
// --------------------------------------------------------------------------------

こんなトコがあるので、コメントを外しましょう。

[6/16 追記]
どうもこの対応をいれると送信(sendUpdate)で失敗するみたい。
深くは追えていませんが要注意。
sendUpdate時に401や403でエラーが返くる。

MGTwitterEngineでIDを指定できない

iOS用のTwitterライブラリであるMGTwitterEngineは基本的にとても便利なんですが、ちょこちょこと手を入れないと使えない部分があります。
代表例がメッセージIDで特定のID以降のツイートだけを読み出したい場合などに指定するんですが、MGTwitterEngineは「unsigned long」になっていて今現在のTwitter上に溢れているメッセージIDでは収まりきりません。

MGTwitterEngine.h/mにある「unsigned long」を「NSString *」にしてしまって、文字データで渡してやるか、「long long」にするかのいずれかの修正が必要です。

2011年6月7日火曜日

_deflateでリンクエラーになるときの対処@iOS

一瞬で忘れそうなのでメモ。

プロジェクト情報を開いて「他のリンカフラグ」に「-lz」を追加する。

2011年5月23日月曜日

twitterの検索結果のcreated_atをNSDateに変換する(Objective-C)

うーん、タイムラインを単純に要求した場合と検索した場合とで返ってくる「created_at」のフォーマットが違うのだ。
Web上にあるサンプルはタイムラインを要求した場合のものなので、単純に真似てもうまくいきません。

NSDateFormatter* inFormat = [[NSDateFormatter alloc] init];
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[inFormat setLocale:locale];
[locale release];
[inFormat setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z"];

NSDate *date = [inFormat dateFromString:createAt];
[inFormat release]; 

変数「createAt」にTwitterから取得した「create_at」が入っているものと仮定しています。上のコードを実行するとdateに「create_at」が指している日付オブジェクトが格納されます。

Twitterから返ってくるcreated_atの値は「Mon, 23 May 2011 12:23:50 +0000」といった値なのだけど、Web上にあるコード例(タイムライン要求時)だと「Mon May 23 12:23:50 +0000 2011」という形式を想定しているのでそのままでは動かない。

とにかく「Mon, 23 May 2011 12:23:50 +0000」という形で返ってくるのでNSDateFormatterには「EEE, dd MMM yyyy HH:mm:ss Z」としなくてはいけない。

また、忘れてはいけないのがNSLocaleで「en_US」を指定すること(多分、en_**なら何でも良さそうだけど試してません)。
こうしないと「Mon」や「May」といった英語表記をうまく拾ってくれません。

海外のサンプルコードだとNSDateFormatterの末尾を「+0000」としているものがあるけれど、こうするとロケールを「en_US」にしているのでNSDateも米国時間で作られてしまう。なので「Z」としてやることで、日本の環境では日本時間になるよう指定します。

2011年4月30日土曜日

annotate-modelsを使う@Rails3

地味にハマったのでメモ。
Railsでモデルを生成すると、テーブルの構成(どんなカラムがあるの?)がモデルのソースを見ただけでは分からないのでannotate-modelsというプラグインを入れてやると、モデルのソースにコメントを追加してくれる。
以下のような手順を踏めばOK
sudo gem install annotate
sudo gem install annotate-models
Gemfileに"gem annotate-models"と追加
bundle install
参考にしている本にはGemfile以降の手順しか載っていなかったので実行時にエラーになってしまった。

インストールが出来たらプロジェクトのトップディレクトリで「annotate」としてやればモデルのソースにコメントが追加される。