如何使用其他View Controller中的搜索栏和搜索显示控制器显示数据

时间:2014-03-14 00:43:02

标签: ios objective-c xcode uitableview searchbar

提前谢谢。

我正在尝试创建一个包含名称,图片和数字的数组的应用。我已经创建了包含相应数组中所有数据的表视图;我已经有搜索栏工作并显示正确的搜索。我缺少的是在另一个视图控制器中显示搜索栏的结果。 (我已经使用了表视图:我选择了一个名称,然后打开另一个视图然后向我显示图片和数字等),我只是错过了同样的事情,但是当我进行搜索时。

这是我的代码。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *simpleTableIdentifier = @"DreamCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

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

    if (tableView == self.tableView) {
       cell.textLabel.text = [Names objectAtIndex:indexPath.row];
        cell.imageView.image =[UIImage imageNamed:[Images objectAtIndex:indexPath.row]];
    } else{
        cell.textLabel.text = [searchResults objectAtIndex:indexPath.row];
    }
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    if (self.searchDisplayController.isActive) {
       [self performSegueWithIdentifier:@"ShowDreamsDetails" sender:self];
    }
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender  {
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    if ([segue.identifier isEqualToString:@"ShowDreamsDetails"])  {
        NSString *object =nil;
        //  NSIndexPath *indexPath =nil;

        if (self.searchDisplayController.isActive) {
            indexPath =[[self.searchDisplayController searchResultsTableView] indexPathForSelectedRow];
            object = [searchResults objectAtIndex:indexPath.row];

            /* *Here is where I have the problem, If I leave it like thi,s it only shows         the first row in my array; I needed to send the correct name and details to the other View Controller.   */

            DesciptionViewController *desViewController = segue.destinationViewController;
            desViewController.PrincipalName = [Names objectAtIndex:indexPath.row ];
            desViewController.PrincipalDescription = [Description objectAtIndex:indexPath.row];
            desViewController.PrincipalNumber = [Numeros objectAtIndex:indexPath.row];
            desViewController.Images1 = [UIImage imageNamed: [Images objectAtIndex: indexPath.row]];  
        } else {
            DesciptionViewController *desViewController = segue.destinationViewController;
            desViewController.PrincipalName = [Names objectAtIndex:indexPath.row];
            desViewController.PrincipalDescription = [Description objectAtIndex:indexPath.row];
            desViewController.PrincipalNumber = [Numeros objectAtIndex:indexPath.row];
            desViewController.Images1 = [UIImage imageNamed: [Images objectAtIndex: indexPath.row]];

        }
    }
}

先感谢任何人,如果这是一个重复的问题,我很抱歉;我试图四处寻找,但我没有找到任何东西。

1 个答案:

答案 0 :(得分:0)

从此代码中可以清楚地了解searchResults数组中存储的内容。通常这将是表示Principal的对象,它具有Name,Description,Numeros和Image的属性,但是您明确地将它们保存在单独的数组中。

当你进行搜索并显示结果时,你正在访问这些数组;你需要在这里重新创造你在那里所做的事情。换句话说,你知道你有搜索结果#row,现在你需要将它(我猜通过searchResults)映射到原始数组中的正确行。

换句话说,请发布tableView:cellForRowAtIndexPath

的代码

编辑:在cellForRowAtIndexPath的代码之后:添加

好的,所以你只在searchResults中获得了名字,这意味着你必须找到其他数据。

同样,创建一个新的对象类型Principal是最简单也是最好的,它具有Name,Description,Numeros和Image的属性,那么你的主数组和searchResults不是字符串,而是Principals,你可以轻松处理为viewcontroller提供适当的信息。 (实际上,您的子视图控制器可能具有属性Principal * person,您可以从主阵列或搜索阵列中为其分配适当的Principal。

但是......如果你想修补它并使其有效,你可以>从Names数组中搜索searchResult中所选名称的名称。 (这假设没有两个人有相同的名字,否则它总会找到第一个。)

所以你的prepareForSegue改为:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender  {
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    if ([segue.identifier isEqualToString:@"ShowDreamsDetails"])  {
        NSInteger realRow = indexPath.row;
        if (self.searchDisplayController.isActive) {
            indexPath =[[self.searchDisplayController searchResultsTableView] indexPathForSelectedRow];
            NSString * name = (NSString *) [searchResults objectAtIndex:indexPath.row];
            realRow = [Names indexOfObject:name];
        }
        if (realRow != NSNotFound) {
            DesciptionViewController *desViewController = segue.destinationViewController;
            desViewController.PrincipalName = [Name objectAtIndex: row];
            desViewController.PrincipalDescription = [Description objectAtIndex: row];
            desViewController.PrincipalNumber = [Numeros objectAtIndex: row];
            desViewController.Images1 = [UIImage imageNamed: [Images objectAtIndex: row]];
        } else {
            NSLog(@"Well, this is very odd; an invalid indexPath or a name in searchResults that's not in Names");
        }
    }
}

但同样,定义一个Principals对象并将其放在两个数组中会更好。