不況だし、貨幣変換機でも
というわけで今年こそはCocoaってみるのを目標にしたいところ。ようやく[]な記法にも違和感を覚えなくなってきたので、やっぱりCurrencyConverterから始めてみましたよ。
普通のCurrencyConverterはなんとなくわかった気分なのでCocoaBindingサンプルをやってみました。
とりあえずプロジェクトを作って次にモデルの作成をしてみます。手順どおりにIBでNSObjectのサブクラスを作って名前を変更、ClassesメニューからCreate Files for アイテムを選んでファイルを作成っと…?
そんなメニューないじゃん!
ちょっくら調べてみるとXcode3.0あたりからこのへんの仕組みが変わって、IBでモデルからコード作るんじゃなくてXcodeでコード作ってからIBでモデルにクラスを選択するようになってるんですなー。
でもだったらせめてチュートリアルぐらいはその変更を反映しておいてよorz
このサンプルでの要点の一つはsetKeys: triggerChangeNotificationsForDependentKeyってメソッドみたいで、これで特定のモデルのキーが変化したときに呼び出すキーを設定するようですね。ここで設定するキー値のスペルミスしてうまく動かなく、それが分かるのに時間がかかりました(なんか手軽に調べる方法がありそうな気がしますが)。とりあえずそれを直すと問題なく動きました。けど、背後でどんな仕組みがうごいてるのかは今ひとつ分からない訳だったりしますけど。
ひとまずこのsetKeys: triggerChangeNotificationsForDependentKeyを調べてみようとF1押してリファレンスを見てみると
とつれない解説が。だったらせめてチュートリアルぐらいは(ry
廃止というならば、その新しいメソッドを使うように変更しないことには、この先生きのこる事が出来ないでしょうから、変更してみることにします。setKeys: triggerChangeNotificationsForDependentKeyとパラメータが違うのでちょっと悩みましたが、しばらくしてこの二つのメソッド、変更通知側と受け取り側の立場をどうとっているかを反転しているのってのに気づきました。
setKeys: triggerChangeNotificationsForDependentKeyが特定のキーが変更されたときに呼び出すキーを設定するのに対し、keyPathsForValuesAffectingValueForKeyはあるキーに対する変更通知を行うキーの一覧を戻してやれば良さそうです。
[Converter setKeys:[NSArray arrayWithObjects:@"dollarsToConvert", @"exchangeRate", nil]
triggerChangeNotificationsForDependentKey:@"amountInOtherCurrency"];
はdollarsToConvertおよびexchangeRateが変更されたときにamountInOtherCurrencyキーを呼び出すように設定しているので、これをkeyPathsForValuesAffectingValueForKeyでやるには
+(NSSet*)keyPathsForValuesAffectingValueForKey:(NSString*)key {
if (key == @"amountInOtherCurrency") {
return [NSSet setWithArray:[NSArray arrayWithObjects:@"dollarsToConvert", @"exchangeRate", nil]];
}
return [super keyPathsForValuesAffectingValueForKey:key];
}
でよいはず。initializeでやっていたsetKeyはコメントアウトしていざ実行!
あれ?うごかん
デバッガで見てみるとifのところでうまく判定していないみたい…ってkeyはポインタだからこんな==オペレータで等値判定できるわけないですな。
+(NSSet*)keyPathsForValuesAffectingValueForKey:(NSString*)key {
NSComparisonResult result = [key compare:@"amountInOtherCurrency"];
if (result == NSOrderedSame) {
return [NSSet setWithArray:[NSArray arrayWithObjects:@"dollarsToConvert", @"exchangeRate", nil]];
}
return [super keyPathsForValuesAffectingValueForKey:key];
}
判定部分を2行にわけてるのはデバッガで見る時楽をするため。修正版のコードだとちゃんと動きました。まあ相変わらず後ろでどんなことが行われているかがぼんやりとしか分かってないですが。
トラックバック(0)
このブログ記事を参照しているブログ一覧: 不況だし、貨幣変換機でも
このブログ記事に対するトラックバックURL: http://hogelab.net/mt4/mt-tb.cgi/1781

きのこる先生!