我有一个应用程序,当你使用搜索栏时根据你输入的内容过滤患者,但是当你点击一行时它总是在下一个nib文件中显示相同的数据。我知道这是因为indexPath随着单元格顺序的改变而改变,但是它们的数量是否有一种方法可以使它转到正确的位置?
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];
}
答案 0 :(得分: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
上,您需要从.h文件中删除indexPath
属性,并将其替换为(或公开公开)您的属性,以获取控制器当前获取的patient
indexPath
。然后,您可以从indexPath
删除有关PatientController
的所有内容,因为您已经拥有patient
个实例。
答案 1 :(得分:1)
你的错误在initWithIndexPath
的实现中,虽然我不知道你发布它的位置。
您需要使用索引路径通过查询用于填充当前显示的表的数据结构来获取单元格所表示的数据。所以你想要查询filteredPatients,但它只是字符串。用实际的患者对象填充它,并在表格要求细胞时生成字符串。
这是糟糕的设计,患者视图控制器应该不知道索引路径。使用索引路径获取患者,然后将其传递给initWithPatient
此外,使用像这样的app委托是一个坏主意。您可以使用self.navigationController