-1

我有一个应用程序,当您使用搜索栏时,它会根据您输入的内容过滤患者,但是当您单击一行时,它总是在下一个 nib 文件中显示相同的数据。我知道这是因为 indexPath 随着单元格的顺序和数量的变化而变化,但是有没有办法让它去正确的?

索引路径代码:

- (void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    LSAppDelegate *delegate = (LSAppDelegate *)[[UIApplication sharedApplication] delegate];
    PatientController *patient = [[PatientController alloc] initWithIndexPath:indexPath];
    [delegate.navController pushViewController:patient animated:YES];
    [tv deselectRowAtIndexPath:indexPath animated:YES];
}

搜索代码:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    if (searchText.length == 0) {
        isFiltered = NO;
    } else {
        isFiltered = YES;

        filteredPatients = [[NSMutableArray alloc] init];

        for (Patient *patient in patients) {
            NSRange patientNameRange = [[patient.patientName substringToIndex:1] rangeOfString:searchText options:NSCaseInsensitiveSearch];

            if (patientNameRange.location != NSNotFound) {
                [filteredPatients addObject:[NSString stringWithFormat:@"%@ %@", patient.patientName, patient.patientSurname]];
            }
        }
    }
    [self.tableView reloadData];
}
4

2 回答 2

3

完成过滤后,您需要刷新 UI(可能是表格视图)。现在应该从过滤结果中获取行信息 - 这包括行数、单元格内容和单元格选择源数据。如果您在搜索后刷新并使用正确的数据源,那么一切都会匹配。


不要indexPath绕过去。它是您的表视图控制器的私有内部状态(以及如何使用它取决于关于搜索是否正在进行的私有状态)。因此,获取所选行的患者对象并传递它。就像是:

Patient *selectedPatient = nil;

if (!isFiltered) {
    selectedPatient = patients[indexPath.row];
} else {
    selectedPatient = filteredPatients[indexPath.row];
}


PatientController *patientController = [[PatientController alloc] initWithIndexPath:indexPath];
patientController.patient = selectedPatient;

这都进去了didSelectRowAtIndexPath:。在PatientController您需要indexPath从 .h 文件中删除该属性并将其替换为(或公开)您的属性,以patient获取控制器当前由于.h 文件而获得的属性indexPath。然后,您可以删除有关indexPathfrom 的所有内容,PatientController因为您已经拥有该patient实例。

于 2013-08-25T13:04:20.433 回答
1

您的错误在您的实施中,initWithIndexPath但由于您没有发布它,我不知道在哪里。

您需要使用索引路径通过查询用于填充当前显示的表的数据结构来获取单元格表示的数据。所以你想查询过滤的病人,但它只包含字符串。用实际的患者对象填充它,并在表格要求单元格时生成字符串。

这是一个糟糕的设计,患者视图控制器不应该知道索引路径。使用索引路径获取患者,然后将其传递给类似的东西initWithPatient

此外,像这样使用应用程序委托是一个坏主意。您可以访问包含导航控制器self.navigationController

于 2013-08-25T14:42:32.363 回答