0

SOは初めてです。私の最初の質問:

Re:コアデータ、バインディングを使用したドキュメントベースのアプリ:

NSTableViewがNSArrayControllerバインドされ、エンティティLineItemにバインドされており、いくつかの列が次のLineItem属性/プロパティにバインドされています:amountpricetotal。+ keyPathsForValuesAffectingTotalを使用して、金額価格の変化を観察しています。プロパティtotalは、変更があれば即座に更新されます。別のエンティティ、Itemがあります。すべてのアイテム は多くのアイテムを持つことができるため、 LineItemとは1対多の関係(アイテム)があります。LineItemsItemには、それぞれのエンティティである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は通知を設定することをお勧めします。私はそれをしましたが、今回はうまくいきませんでした。明らかな回避策をすべて試しましたが、成功しませんでした。それはKVCKVOに帰着すると思います; 残念ながら、Appleは、少なくとも表面上では、NSSetを操作するときに、これらの強力なツールをほとんどサポートしていません。どんな助けでもいただければ幸いです。

4

1 に答える 1

0

ここで最初に目にする問題は、すべてのステートメントが実行される前に、このメソッドから戻ってきたように見えることです。

- (NSNumber *)lineItemTotal {
     float totalOfAllLineItemTotals = [[self valueForKeyPath:@"items.@sum.total"]floatValue];
     [self willAccessValueForKey:@"lineItemTotal"];
     return [NSNumber numberWithFloat:totalOfAllLineItemTotals];
     // Anything below here will never be executed.
     [self didAccessValueForKey:@"lineItemTotal"];
     return [NSNumber numberWithFloat:totalOfAllLineItemTotals];
}

それでも、私は数分かけてこれをコーディングしました。私の経験から、コレクション演算子 (つまり @sum) は CoreData の遅延フェッチされたセットでは機能しないようです。私が行ったすべての試みは、次のようなエラーを引き起こしました。

[<_NSFaultingMutableSet 0x101922270> addObserver:forKeyPath:options:context:] is not supported. Key path: @sum.total

幸いなことに、NSArrayController を使用してこのコレクション オペレータを有効にできるようです。コーディングしたバージョンを githubに置きました。あなたがそこで達成しようとしていたすべての基盤をカバーしたと思います. マスター/詳細テーブル ビューと追加のテキスト フィールド、すべてライブ更新などがあります。

于 2013-02-19T01:55:48.543 に答える