Iphone 搜索筛选的数组indexPath不正确

Iphone 搜索筛选的数组indexPath不正确,iphone,ios,objective-c,uitableview,uisearchbar,Iphone,Ios,Objective C,Uitableview,Uisearchbar,我有一个应用程序,当你使用搜索栏时,它会根据你输入的内容对患者进行过滤,但当你点击一行时,它总是在下一个nib文件中显示相同的数据。我知道这是因为indexPath随着单元格的顺序和数量的变化而变化,但是有没有办法让它转到正确的位置 索引XPath代码: - (void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)indexPath { LSAppDelegate *delegate = (LSAp

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

索引XPath代码:

- (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];
}

完成过滤后,需要刷新UI(可能是一个表视图)。现在,行信息应该取自过滤结果-这包括行计数、单元格内容和单元格选择源数据。如果在搜索后刷新并使用正确的数据源,则所有内容都将匹配


不要到处传递
indexPath
。它是表视图控制器的私有内部状态(如何使用它取决于是否正在进行搜索的私有状态)。因此,获取选定行的patient对象并传递该对象。比如:

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文件中删除
indepath
属性,并将其替换为(或公开)控制器当前由于
indepath
而获得的
患者的属性。然后,您可以从
PatientController
中删除关于
indexPath
的所有内容,因为您已经有了
patient
实例。

您的bug出现在
initWithIndexPath
的实现中,尽管我不知道在哪里,因为您没有发布它

您需要使用索引路径通过查询用于填充当前显示的表的数据结构来获取单元格表示的数据。因此,您可能希望查询filteredPatients,但它只包含字符串。用实际的患者对象填充它,并在表格请求单元格时生成字符串

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


另外,像这样使用app委托是个坏主意。您可以使用
self访问包含的导航控制器。navigationController

您的问题有点模糊。您能详细说明并展示您正在使用的索引路径的一些代码吗?@XCodeMonkey已经添加了代码
PatientController
如何使用
indexPath
?它声明了如下变量:
NSObject*object=[array objectAtIndex:index.row]
然后像这样使用对象:
text1.text=object.name好的,那么该代码中的
array
和您问题中代码中的
filteredPatients
之间有什么联系?您是说如果数组是过滤数组,我应该传递不同的变量吗?好的,我同意@atomk的观点,您根本不应该传递
indexPath
。通过传递它应该可以让它工作,但你需要教
PatientController
比它已经知道的更多(看起来太多了)。我的应用程序实际上已经完成了,所以我不想现在就去更改它,下次再做。我的主要观点是,你的bug在init方法中,所以如果你想要更多的帮助,你应该发布它。