1

期待どおりにUIが更新されません。

アプリケーションは、iTunesと同様のビューを使用して「プロジェクト」を表示します。左側のソースリストを使用すると、右側のリスト(NSTableView)をフィルタリングできます。私のフィルターは、単純なフィールド(名前、文字列など)を調べているときに正しく更新されますが、配列(タグなど)は調べられません。

オブジェクトの1つ(「タグ」と呼ばれるNSMutableArrayフィールドから)からタグを削除していますが、テーブルのNSArrayControllerにバインドされている述語と一致しなくなったため、リストからタグが表示されなくなると思います。

ProjectBrowser.mm:

self.filter = [NSPredicate predicateWithFormat:@"%@ IN %K", 
                                               selectedTag, 
                                               @"tags"];

Project.mm:

[self willChangeValueForKey:@"tags"];
[tags removeAllObjects];
[self didChangeValueForKey:@"tags"];

私もこれを試しましたが、結果は同じです:

[[self mutableArrayValueForKey:@"tags"] removeAllObjects];

Interface Builderのセットアップ:

  • ProjectBrowserオブジェクトはXIBのファイル所有者です
  • NSArrayController(プロジェクトコントローラー)のコンテンツ配列は、「ファイルの所有者」にバインドされています。
  • ProjectControllerのフィルタ述語は「File'sOwner」.filterにバインドされています
  • NSTableViewの列は「ProjectController」.nameにバインドされています
4

2 に答える 2

2

私はこれをドキュメント(KVCコンプライアンス-依存値)で見つけました:

重要:to-many関係への依存関係を設定できないことに注意してください。たとえば、OrderItemオブジェクトのコレクションに対して多対数の関係(orderItems)を持つOrderオブジェクトがあり、OrderItemオブジェクトにprice属性があるとします。Orderオブジェクトに、リレーションシップ内のすべてのOrderItemオブジェクトの価格に依存するtotalPrice属性が必要な場合があります。keyPathsForValuesAffectingValueForKey:を実装し、totalPriceのキーパスとしてorderItems.priceを返すことによって、これを行うことはできません。orderItemsコレクション内の各OrderItemオブジェクトの価格属性を監視し、totalPriceを自分で更新して値の変更に対応する必要があります。

したがって、キーパスに多対多の関係がある場合、KVOの依存関係や通知に依存することはできません。これは私のタグの配列に当てはまるので、この壊れたリンクにパッチを当てるためのコードを追加しました。

「projects」配列にプロジェクトを追加すると、次のようになります。

[newProject addObserver:self forKeyPath:@"tags" options:NSKeyValueObservingOptionNew context:nil];  

そして重要な部分:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([object isKindOfClass:[CProject class]] && [keyPath isEqualToString:@"tags"])
    {
        [self willChangeValueForKey:@"projects"];
        [self didChangeValueForKey:@"projects"];
    }
}

そして、クリーンアップするために、プロジェクトを削除すると、次のようになります。

[project removeObserver:self forKeyPath:@"tags"];

これが最善の解決策かどうかはわかりませんが、リストは常に最新の状態に保たれています。

于 2010-05-21T23:09:48.780 に答える
0

あなたの最初のコード スニペットがコンパイルされることに、私は非常に驚いています。また、期待どおりに機能しない場合もあります。

self.property = foo;

のシンタックスシュガーです

[自己 setProperty: foo];

とにかく、あなたの問題はあなたが観察していないことかもしれtagsません。述語がクエリ文字列のキーを自動的に監視するかどうかはわかりません。

于 2010-05-20T08:54:50.443 に答える