3

基本的にツリー スタイルのグラフを形成するオブジェクトの配列をフィルター処理しようとしています。私がしたいことは、可視プロパティが NO であるこの配列からすべてのオブジェクトを除外すること、またはその親/祖父母/などの可視プロパティが true の場合 (子オブジェクトは可視プロパティを YES にすることができ、親は NO にすることができます)。

親がなくなるか、可視プロパティが見つかるまで、NSPredicate構文を使用して親ノードを検索し続ける方法については不明です。これについて何か方法はありますか?

4

2 に答える 2

1

この質問をしてからしばらく経ちましたが、私がしていたことは別の方向に進んだと思いますが、当時私が望んでいたことを解決するために今気づいたいくつかの可能性があります:

  • フォーマット述語に再帰的に動作させる代わりに、可視プロパティ メソッドに再帰的に動作させます。これは次のように実現できます。
- (BOOL) isVisible {
  return visible && [parent isVisible];
}

//...
id filtered = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"visible == YES"]];
  • フォーマット述語の代わりにブロック述語を使用して、再帰的な走査を行います。
[array filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

    id obj = evaluatedObject;
    while (obj) {
      if (![obj isVisible]) return NO;
      obj = [obj parent];
    }
    return YES;
}]];

または2つの組み合わせ(これが最も堅牢で読みやすいと思います)。

于 2012-03-13T16:05:34.543 に答える
0

あなたがしようとしていることは、単純な単一の述語で可能かどうかわかりません。それがツリーであり、ノードを取得するために述語を使用している場合は、上方向にトラバースし、削除する必要があるかどうかを示す BOOL を返すメソッドを作成する必要があります。

次に、ノードを取得して NSMutableArray に配置し、

for (int i = 0; i < [results count]; i++)
{
    if ([self shouldBeRemoved:[results objectAtIndex:i]])
    {
        [results removeObjectAtIndex:i];
        i--;
    }
}

shouldBeRemoved: メソッドは、単純な再帰メソッドである必要があります。

于 2010-12-02T12:22:28.120 に答える