1

XPath を使用してノードを選択する実験を行っています...次のコードを iOS アプリとして使用して、所有している書籍の種類 (ペーパーバックかハードカバーか) に関する情報を収集しています。

nodes= [rootNode nodesForXpath:@"Collection/books" error:nil];
for (DDXMLNode* node in nodes)
{
    Booktype* bt = [[Booktype alloc] init];
    DDXMLNode *nameNode = [[node nodesForXpath:@"OfType" error:nil]; objectAtIndex:0];
    bt.type = [nameNode stringValue];

   // And lastly, I am adding this object to my array that will be the datasource for my tableView
   [array addObject:bt];
}

私のライブラリ XML は次のようになります。

<Collection>

<books>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
  <ofType>Hardcover</ofType>
</books>

<books>
  <title lang="eng">Stella Bain</title>
  <price>19.99</price>
  <ofType>Hardcover</ofType>
</books>

<books>
  <title lang="eng">The First Phone Call from Heaven</title>
  <price>12.95</price>
  <ofType>Paperback</ofType>
</books>

<books>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
  <ofType>Paperback</ofType>
</books>

</Collection>

だから私は 2 冊のペーパーバックと 2 冊のハードカバーの本を持っています。ここでの問題は、データを my にロードすると、リクエストtableViewに対して合計 4 つのリストが表示されることです。ofType

次のようなテーブル ビューが表示されます。

ここに画像の説明を入力

タイプのインスタンスを 1 つだけ持つにはどうすればよいですか? したがって、それぞれ 2 つではなく、1 つのペーパーバックのリストと 1 つのハードカバーのリストしか取得できません...私の意図はtableView、選択したタイプの本のカテゴリのすべての本をリストする別のリストを後で追加することです。

回答はできるだけ具体的かつ詳細に記入してください。

よろしく、 -VZM

更新:私は以下を実装しようとしました:

if (![array containsObject:bt]) {
    [array addObject:bt];
}

しかし残念ながら、これは同じ結果を返しています。

4

3 に答える 3

0

これがあなたにアイデアを与えることを願っています...

  NSMutableArray *arrayPaperCover = [[NSMutableArray alloc]init];
    NSMutableArray *arrayHardCover = [[NSMutableArray alloc]init];

    nodes= [rootNode nodesForXpath:@"Collection/books" error:nil];
    for (DDXMLNode* node in nodes)
    {
        Booktype* bt = [[Booktype alloc] init];
        DDXMLNode *nameNode = [[node nodesForXpath:@"OfType" error:nil] objectAtIndex:0];
        bt.type = [nameNode stringValue];


        if ([bt.type isEqualToString:@"Paperback"]) {
            [arrayPaperCover addObject:bt];

        }
        else ([bt.type isEqualToString:@"Hardcover"]) {
            [arrayHardCover addObject:bt];

        }

    }
    NSMutableArray * dataSource = [[NSMutableArray alloc]init]; // this will be your data source 
    [dataSource addObject:arrayPaperCover];
    [dataSource addObject:arrayHardCover];
于 2013-11-15T06:06:48.110 に答える
0

asに追加Booktypeする前に簡単に確認できます。array

if (![array containsObject:bt]) {
    [array addObject:bt];
}
于 2013-11-15T04:09:42.140 に答える
0

これにはNSPredicateを使用する必要があります。

変化する:

[array addObject:bt];

と:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.type == %@", bt.type];
if ([[array filteredArrayUsingPredicate:predicate] count] == 0)
{
    [array addObject:bt];
}
于 2013-11-15T05:51:24.833 に答える