0

皆さんこんにちは

私はこのように私のプロジェクトに2つの配列を持っています

- (void)viewDidLoad
    {
        [super viewDidLoad];
        deviceName = [[NSArray alloc] initWithObjects: @"iPhone", @"Galaxy", @"iPad", @"iMac", @"HTC One", nil];
        companyName = [[NSArray alloc] initWithObjects:@"Apple", @"Samsung", @"Apple", @"Apple", @"HTC", nil];
    }

そして、私はこのコードを使用してセルを変更しています..

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return [searchResult count];
    } else {
        return [deviceName count];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
    }

        if ([self.searchDisplayController isActive]) {

            NSString *name = [searchResult objectAtIndex:indexPath.row];
            NSString *company = [companyName objectAtIndex:indexPath.row];
            cell.textLabel.text = [NSString stringWithFormat:@"%@ - %@", name, company];

        } else {

            NSString *name = [deviceName objectAtIndex:indexPath.row];
            NSString *company = [companyName objectAtIndex:indexPath.row];
            cell.textLabel.text = [NSString stringWithFormat:@"%@ - %@", name, company];
        }
    return cell;
}

そして、私はこのコードを使用して検索しています..

#pragma mark - UISearchDisplayController delegate methods

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *resultPredicate = [NSPredicate
                                    predicateWithFormat:@"SELF contains[cd] %@",
                                    searchText];
    [searchResult release];
    searchResult = [[deviceName filteredArrayUsingPredicate:resultPredicate]retain];
}

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                      objectAtIndex:[self.searchDisplayController.searchBar
                                                     selectedScopeButtonIndex]]];
    return YES;
}

最初はセルはこのように問題ありません

cell1 - iPhone - Apple

cell2- ギャラクシー - サマウン

...

「htc」を検索すると、検索は正常に機能しますが、セルは次のようになります

cell1- HTC One - アップル

...

それを修正するために何ができますか?

4

1 に答える 1

2

テーブル ビュー データ ソースとして 2 つの個別の配列があります。

deviceName  = [ "iPhone", "Galaxy", "iPad", "iMac", "HTC One"]
companyName = [ "Apple", "Samsung", "Apple", "Apple", "HTC" ]

deviceName次に、あなたの例では、からフィルター処理された配列を作成します

searchResult = [ "HTC One"]

cellForRowAtIndexPathフィルター処理された配列との配列を使用すると、companyName「HTC One - Apple」という表示が得られます。

この問題を解決するには、データ ソースとして 2 つの個別の配列を使用するのではなく、辞書の1 つの配列を使用する必要があります。各辞書にはデバイス名と会社名が含まれています。

allDevices = @[
            @{@"name": @"iPhone", @"company": @"Apple"},
            @{@"name": @"Galaxy", @"company": @"Samsung"},
            ...
            ];

次のように配列をフィルタリングします。

NSPredicate *resultPredicate = [NSPredicate
                                predicateWithFormat:@"name CONTAINS[cd] %@",
                                searchText];
filteredDevices = [allDevices filteredArrayUsingPredicate:resultPredicate];

これは、各デバイスの名前 会社をfilteredDevices含む辞書の配列でもあります。次に、で、簡単に行うことができますcellForRowAtIndexPath

NSDictionary *device;
if ([self.searchDisplayController isActive]) {
    device = filteredDevices[indexPath.row];
} else {
    device = allDevices[indexPath.row];
}
NSString *name = device[@"name"];
NSString *company = device[@"company"];
cell.textLabel.text = [NSString stringWithFormat:@"%@ - %@", name, company];

注意:通常は ARC を使用するため、retain/release 呼び出しはすべて省略しました。

于 2013-11-10T08:17:04.807 に答える