2014年1月24日金曜日

[iOS][Objective-C]UITableViewについて その2


どうも。

前に、
UITableViewについて書いて、
「コレクションを使ってハンドリングしようぜ(`・ω・´) 」
ってなことを書いたワケですが。
http://synonym-of-raspberry.blogspot.jp/2014/01/iosobjective-cuitableview.html

例えば、
商品一覧をTableViewに表示するとしたら、
・商品名
・価格
・在庫数
など、
複数のデータを表示することになる。

こういうのは、
Itemみたいな名前のクラスに、
ひとまとまりの情報として持っておきましょうとなり。

そうすると、
NSString *name;
int price;
int stock;

みたいなメンバで構成し、
それぞれのGetterやSetterがあって。

で、
TableViewの方に戻ると、
TableViewCellでそれらの情報を表示するときは、
TableViewCell内のUILabelになるワケで。
そうすると、
UILabelのsetTextは引数にNSString*が必要。

ので、
- (NSString *)getPriceStr
みたいなGetterを追加しといてやると、
表示部分のコードがすっきりするんじゃないかと。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath内で、

Item *item = [itemList objectAtIndex:indexPath.row];
[cell.itemLabel setText:[item getPriceStr]];

と、
それなりにシンプルで読みやすくなりそう。

intの値をGetして変換して、
でもいいけど、
デリゲートメソッドの中がぐちゃぐちゃしちゃうから…。
xxxViewControllerの中に切り出すと、
xxxViewControllerが無用に肥大化するし、
別の画面でも必要なときは、
同じ処理を別のViewControllerにも書かなきゃいけないし。

この辺りは好みによってきたり、
スマートな方法はいくらでもあるし、
プロジェクトによって諸般の事情があったりするとは思いますが。

個人的な経験に照らしてみると、
画面のコード(xxxViewController)や、
UITableViewのデリゲートメソッド内を、
少しでもすっきりさせた方が、
コーディングやメンテナンスが楽になる。

ただでさえ、
UITableViewのデリゲートメソッド内は、
switch文もしくはif文での分岐を余儀なくされるし、
StoryboardのprototypeCellなんかを使えば、
セル内の構成部品の外観に関するコードも、
cellForRowAtIndexPathに書かなきゃならなくなったりと、
ごちゃごちゃしがち(´・ω・`)

後々のこと、
誰か他の人が手を入れる可能性まで考えれば、
なるべくきれいな形にしていた方がいいかな、
などと思ったりするが、
他の人はどうしてるのだろうか…?

ちなみに、
これを書いてるこの日、
強くこのことを再認識した…。

既に担当を外れたメンバーが書いた画面に、
仕様の変更が入って、
俺が手を入れなきゃいけなくなって…。
デリゲートメソッド内がぐちゃぐちゃ(´・ω・`)

トピック的には外れるけど…。
いわゆる変数のスコープとか、
メソッドから値をreturnすることが、
イマイチ分かっていない人だったので、
不必要に広いスコープに変数を持って、
その変数を散らばせて処理してて、
これも骨が折れたw

ともかく、
最終形がUITableViewになる場合は、
その下準備の段階から、
「整理」を意識しておかないと、
バグも検出しづらいし、
改修もしづらい。


それでは。
ちゃお☆


まこぴー。