今回は、割り勘から除外する金額を入力する画面、PaymentViewControllerクラスの説明。
 自分だけしか欲しがるやつがいないけど、どーしても注文したいもんがあった場合に、ここに入力していくわけですな。
 合計だけじゃなく履歴表示もできるようにテーブルビューを組み込んどります。この履歴いっぱいになるまで注文する奴ってのもすごいですが…
 どこまでマイペースなんだ、と。

PaymentViewController

$テン*シー*シー-1

 ま~、金額は¥表示して3桁ごとにカンマで区切ろうかな~と、いうことでNSNumberFormatterクラスを使って数値を文字列化してます。
numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter
setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter
setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"ja-JP"]];

 こんな感じで作っておいて
[numberFormatter stringFromNumber:number]

 ってやると

 1350 → ¥1,350

 て感じに文字列にしてくれるわけですよ。
 ここで渡してるnumberはint型じゃなくNSNumberという、れっきとしたオブジェクトね。
 このNSNumberはiPhoneアプリ開発、その(207)で説明したように数字のオブジェクト。
 で、こいつは
NSMutableArray* exclusions;

 という除外金額の配列に各除外金額を保存させるのにも使われてます。NSMutableArrayはint型をaddObjectできね~のよ。
 ま、あとは実験的に入金テキストフィールドにUITextFieldクラスを使わず
@interface XUITextField : UITextField {
}
@end

 て継承クラス使ってます。
 こいつは以下のように自分が触られるとキーボードを表示/非表示するようにする機能を追加しただけ。
@implementation XUITextField
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if ([self isFirstResponder]) {
[self resignFirstResponder];
} else {
[super touchesBegan:touches withEvent:event];
}
}
@end


@implementation UITextField(EXT)

 とかやってカテゴライズするってのもありかなと思ったけど、これやっちゃうと、どのUITextFieldインスタンスでも触れられるとキーボード発射しちゃうので、それはそれで具合わりーなと思い、継承クラスにしますた。
 ヘッダーでは
UITextField* amountTextField;

 ってしたままだけどPaymentViewController.xibファイル側でクラスを切り替えてます。

$テン*シー*シー-2

 ここらへん「おお、こんなやり方もありなんや~」とか楽しみながら実装中。
 
 テーブルへの変更はデリゲーションパターンで通知するようにしとります。
@protocol PaymentViewControllerDelegate
// inAmountの金額が追加された。
-(BOOL)paymentViewController:(PaymentViewController*)ctl
add:(int)inAmount;
// 配列inAmountAtIndex番目の除外金額を削除していいならYESを返す。
-(BOOL)paymentViewController:(PaymentViewController*)ctl
remove:(int)inAmountAtIndex;
@end

 なので、このビューはまったく「ダイスを回せ!」のモデルに依存せずに作られてるわけですな。
 GUIフォルダ以下のソースを自分のプロジェクトに組み込めば、誰でもこの画面を利用できる。
 もちろん、利用、改造使用OKっす!
 
 どんとこい!改造!

 テーブルの削除や追加なんかは、特に目新しいことはないですな。詳しく知りたい人はドリルを読みましょう。

 他に変わってるところとしては、UITableViewControllerじゃなくUIViewControllerにUITableViewDataSource, UITableViewDelegateプロトコルを追加してPaymentViewControllerクラスを定義してるので、画面が表示された時にスクロールバーインジケータをフラッシュさせたりとか、テーブル項目の削除ボタンが出た時に、ナビバーの編集(Edit)ボタンを終了(Done)に変更したりとか、UITableViewController継承してりゃしなくてすんだ処理をこまごま対応してます。
フラッシュとか
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[tableView flashScrollIndicators];
}

ナビバーボタン調整とか
- (void)tableView:(UITableView *)tableView
willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath {
[super setEditing:YES animated:YES];
}


 まあ、[self editButtonItem]のおかげ(テーブルとナビゲーションを理解する(2)読むべし)でかなり楽はさせてもらってます。

------------
サンプルプロジェクト:Dev20100323.zip