-1

検索バーを使用すると、入力内容に応じて患者をフィルタリングするアプリがありますが、行をクリックすると、常に次の 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];
}
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:ます。.hファイルからプロパティPatientControllerを削除し、.h ファイルの結果としてコントローラーが現在取得している のindexPathプロパティに置き換える (またはパブリックに公開する)必要があります。次に、インスタンスが既にあるため、 からに関するすべてを削除できます。patientindexPathindexPathPatientControllerpatient

于 2013-08-25T13:04:20.433 に答える