SOは初めてです。私の最初の質問:
Re:コアデータ、バインディングを使用したドキュメントベースのアプリ:
NSTableViewがNSArrayControllerにバインドされ、エンティティLineItemにバインドされており、いくつかの列が次のLineItem属性/プロパティにバインドされています:amount、price、total。+ keyPathsForValuesAffectingTotalを使用して、金額と価格の変化を観察しています。プロパティtotalは、変更があれば即座に更新されます。別のエンティティ、Itemがあります。すべてのアイテム は多くのアイテムを持つことができるため、 LineItemとは1対多の関係(アイテム)があります。LineItems。Itemには、それぞれのエンティティであるItemにバインドされているNSArrayControllerにバインドされたNSTableViewもあります。このテーブルにもいくつかの列がありますが、1つはlineItemTotal(items。@ sum.total)です。
- (NSNumber *)lineItemTotal {
float totalOfAllLineItemTotals = [[self valueForKeyPath:@"items.@sum.total"]floatValue];
[self willAccessValueForKey:@"lineItemTotal"];
return [NSNumber numberWithFloat:totalOfAllLineItemTotals];
[self didAccessValueForKey:@"lineItemTotal"];
return [NSNumber numberWithFloat:totalOfAllLineItemTotals];
}
lineItemTotal値は、NSNotification NSManagedObjectContextObjectsDidChangeNotificationを使用して即座に更新されます。これにより、セレクターupdateLineItemTotal:が呼び出され、メッセージが送信されます。[self.view setNeedsDisplay:YES]; すべて正常に機能します...ただし、このビューは領収書のように見えるはずです。そのため、ユーザーが期待するように、 LineItemテーブルの下にNSTextFieldがあり、合計を表示します。Itemと同じNSArrayControllerにバインドしようとしましたが、機能しません。バインディングインスペクターで、コントローラーキーにarrangedObjectsを選択できません、テーブルではないので。(これがアイテムテーブルの設定方法であり、正常に機能しています)私の唯一の選択肢は、コントローラーキーの「選択」です。いずれの場合も、常に正しい値が表示されますが、新しいItemインスタンスを作成して(追加にバインドされたNSButtonを介して) 、古いItemインスタンスに戻った後でのみです。他のすべてのように即座に更新されるわけではありません。ユーザーはこれが専門家ではないと感じるでしょう。私はHillegassの提案を試し、Stack Overflowを検索し、NSSetを処理する際の値の更新に関してAppleが推奨する回避策を試しました。Appleは通知を設定することをお勧めします。私はそれをしましたが、今回はうまくいきませんでした。明らかな回避策をすべて試しましたが、成功しませんでした。それはKVCとKVOに帰着すると思います; 残念ながら、Appleは、少なくとも表面上では、NSSetを操作するときに、これらの強力なツールをほとんどサポートしていません。どんな助けでもいただければ幸いです。