2013-12-12 235 views
0

我想實現一個搜索欄到我的應用程序,但遇到了一些問題。 我Tableview中的數據來自PLIST並填充到NSMutableArray中。 我的PLIST看起來像這樣,我也可以看到我的陣列中的數據與NSLOG。 現在我想提供搜索到我的tableview,以便您可以搜索「名稱」和搜索列出符合輸入名稱的所有條目。但是,我怎樣才能使我的搜索能夠搜索所有「名稱」條目?搜索欄與字典中的數組

更新:我已經這樣做了,但如果我開始在我的搜索字段中輸入,數組保持空。

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
    NSPredicate *resultPredicate = [NSPredicate 
            predicateWithFormat:@"name contains[c] %@", 
            searchText]; 

    NSMutableArray *filtered = [myArray filteredArrayUsingPredicate:resultPredicate]; 

    NSLog(@"%@", filtered); 
} 

#pragma mark - UISearchDisplayController delegate methods 
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller 
shouldReloadTableForSearchString:(NSString *)searchString 
{ 
    [self filterContentForSearchText:searchString 
           scope:[[self.searchDisplayController.searchBar scopeButtonTitles] 
             objectAtIndex:[self.searchDisplayController.searchBar 
                selectedScopeButtonIndex]]]; 

    return YES; 
} 

我填充數據到我的tableview是這樣的:

cell.textLabel.text = [[[[myArray objectAtIndex:indexPath.section]objectForKey:@"Rows"]objectAtIndex:indexPath.row]objectForKey:@"name"]; 

任我PLIST看起來是這樣的。

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>Hot Drinks</key> 
    <array> 
     <dict> 
      <key>title</key> 
      <string>COFFEE SPECIALS</string> 
      <key>Rows</key> 
      <array> 
       <dict> 
        <key>price</key> 
        <string>3,20 Euro</string> 
        <key>name</key> 
        <string>Espresso</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string></string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>3,20 euro</string> 
        <key>name</key> 
        <string>Ristretto</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>Short &amp; strong espresso</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>3,50 Euro</string> 
        <key>name</key> 
        <string>Espresso Macchiato</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>Espresso with hot milk </string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>4,80 Euro</string> 
        <key>name</key> 
        <string>Espresso Doppio</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>Double espresso</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>3,50 Euro</string> 
        <key>name</key> 
        <string>Coffee</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>Freshly brewed regular coffee</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>4,00 Euro</string> 
        <key>name</key> 
        <string>Cappuccino</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>Espresso with hot milk and milk froth</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>4,50 Euro</string> 
        <key>name</key> 
        <string>White Coffee</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>coffee with a lot of hot milk and milk froth</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>4,50 Euro</string> 
        <key>name</key> 
        <string>Latte Macchiato</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>Espresso with a lot of hot milk and milk froth, served in a glass</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>0,50 Euro</string> 
        <key>name</key> 
        <string>Flavours of your choice</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>Chocolate, caramel, white chocolate, hazelnut </string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>6,50 Euro</string> 
        <key>name</key> 
        <string>Hot 「Valrhona」 chocolate</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>Hot 「Valrhona」 chocolate prepared with milk and cream </string> 
       </dict> 
      </array> 
     </dict> 
     <dict> 
      <key>title</key> 
      <string>TEA SPECIALTIES</string> 
      <key>Rows</key> 
      <array> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>English Breakfast – Ceylon/St. James</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>BLACK TEA</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Darjeeling Summer Gold</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>BLACK TEA</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Classic Chai – Indien</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>BLACK TEA</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Assam Barie</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>BLACK TEA</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Earl Grey (Darjeeling)</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>FLAVOURED BLACK TEA</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Dung Ti Oolong – China</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>OOLONG TEA</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Green Dragon</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>GREEN TEA</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Grüner Tee Morgentau</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>FLAVOURED GREEN TEA</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Jasmin Gold</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>FLAVOURED GREEN TEA</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Pai Mu Tan Silver Typ</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>WHITE TEA</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Get the Power</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>FLAVOURED FRUIT INFUSION</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Red Fruit</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>FLAVOURED FRUIT INFUSION</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Herbs and Ginger</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>HERBAL INFUSION</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Original Roibosh</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>HERBAL INFUSION</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Verbena</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>HERBAL INFUSION</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Fruity Camomile</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>HERBAL INFUSION</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Mint &amp; Fresh</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>HERBAL INFUSION</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Equilibrium</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>FLAVOURED HERBAL INFUSION</string> 
       </dict> 
       <dict> 
        <key>price</key> 
        <string>5,00 Euro</string> 
        <key>name</key> 
        <string>Fruits of Paradise</string> 
        <key>link</key> 
        <string></string> 
        <key>subname</key> 
        <string>FLAVOURED HERBAL INFUSION</string> 
       </dict> 
      </array> 
     </dict> 
    </array> 
</dict> 
</plist> 

回答

0

您可以使用NSPredicate

我建議如下:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"name contains[c] %@", stringFromSearchField]; 

而且你可以在以下方式獲得濾波陣列:

NSMutableArray *rows = [NSMutableArray array]; 
for(NSDictionary *dict in myArray) 
{ 
    NSArray *tempRows = dict[@"Rows"]; 
    if([tempRows isKindOfClass: [NSArray class]] && tempRows.count) 
    { 
     [rows addObjectsFromArray:tempRows]; 
    } 
} 
NSArray *filteredArray = [rows filteredArrayUsingPredicate: predicate]; 
+0

請參見上面我的更新。我的陣列保持空白。 – halloway4b

+0

我已經更新了我的答案。 –

+0

這工作得很好。非常感謝。結果顯示正確。是否有機會在搜索結果中顯示細胞的詳細信息?我已經把它以這種方式顯示,除了名稱的子名稱if(tableView == self.searchDisplayController.searchResultsTableView)cell.textLabel.text = [[filteredArray objectAtIndex:indexPath.row] objectForKey:@「name」] ; cell.detailTextLabel.text = [[filteredArray objectAtIndex:indexPath.row] objectForKey:@「subname」]; NSLog(@「%@」,[[filtered objectAtIndex:indexPath.row] objectForKey:@「subname」]); } – halloway4b