1

問題が発生しました。ビュー間でデータを渡すためにUITableViewusingを作成しました ( toの a )。このメソッドを使用しました。CoreDataUITableViewDetailViewrow

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"UpdateData"]) {
        NSManagedObject *selectedDevice = [self.datas objectAtIndex:
                                 [[self.tableView indexPathForSelectedRow] row]];
        DetailViewController *destViewController = segue.destinationViewController;
        destViewController.datas = selectedDevice;

     }
}

すべてが正常に動作します。しかし、後でUISearchBar動作しないを追加したので、すべての構成を保存したNSManagedObject別の を作成し、動作しました。しかし、SearchBar tableView から行を選択するたびに実行するために、を変更する必要があります。NSMutableArrayNSStringscell.textLabel.textprepareForSeguesegue

問題は、この種の とのsegue接続を実行するには、CoreDataを使用する必要があることNSManagedObjectです。したがって、私の質問は、my の内部indexPath.rowから を取得し、それを myの右側に対応させるにはどうすればよいかということです (これは、実行に使用した配列です)。の法線、コードを参照) ? セル(cell.textLabel.text)の文字列を比較できると思ったのですが、UISearchBarUITableViewindexPath.rowself.datasegueUITableView

  1. やり方がわからない。
  2. 同じ名前の行が 2 つあると、問題が発生する可能性があります。

何かアドバイス?

編集:ストーリーボードから UISearchBar を追加しました。これは、メイン テーブル ビューをフィルター処理するために使用するコードです。

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    [_searchDati removeAllObjects];
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", searchText];
    _searchDati = [NSMutableArray arrayWithArray:[_tableData filteredArrayUsingPredicate:resultPredicate]];
}

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                      objectAtIndex:[self.searchDisplayController.searchBar
                                                     selectedScopeButtonIndex]]];

    return YES;
}

UISearchBar_searchDati用に作成した_tableData配列と、CoreDatas を含む NSManagedObject のセルの名前を格納するために作成した配列はどこにありますか。

そして私もこれを追加しました

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView
{
    [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
}

//Handle selection on searchBar
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        [self performSegueWithIdentifier: @"UpdateData" sender: self];
    }
}

最初はこれを使用し、クラスを登録する必要があるか、エラーが発生したためです

static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

もう 1 つは UISearchBarTableView の選択を処理します。

ここで、前に言ったようにtableViewをロードします

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];


    if (tableView == self.searchDisplayController.searchResultsTableView) {
       // see filter method
        cell.textLabel.text = [_searchDati objectAtIndex:indexPath.row];

    } else {
        NSString *string;
        NSManagedObject *data = [self.datas objectAtIndex:indexPath.row];
        string = [NSString stringWithFormat:@"%@", [data valueForKey:@"name"]];
        [cell.detailTextLabel setText:nil];
        cell.textLabel.text = string;

        //store the string to the tableView array
        [_tableData addObject:string];
    }

    return cell;
}

編集#2:

私はこのコードを書きました

NSIndexPath *indexPath = nil; NSIndexPath *indexPath2 = nil;

if ([self.searchDisplayController isActive]) {

    indexPath = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow];

    for(int i = 0 ; i < _tableData.count ; i++){
        if([self.searchDati[indexPath.row] isEqualToString:_tableData[i]]){
            indexPath2 = [NSIndexPath indexPathForRow:i inSection:1];
        }
    }
    NSManagedObject *selectedDevice = [self.datas objectAtIndex:indexPath2.row];
    destViewController.datas = selectedDevice;

UISearchBar の行をクリックすると、初めて機能します。検索を行って行をクリックすると、右側の DetailView に移動しますが、もう一度実行するとクラッシュしてこのエラーが発生します

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 5 beyond bounds [0 .. 4]'

問題は、indexPath.row == 0 から開始するのではなく、初回の後に一種の山を作成することだと思います。なにか提案を?前もって感謝します :)

4

1 に答える 1

0

これを試して、

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"UpdateData"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
NSManagedObject *selectedDevice = [self.datas objectAtIndex:indexPath.row];
        DetailViewController * destViewController = [segue destinationViewController];
destViewController.datas = selectedDevice;

     }
}
于 2013-10-16T05:32:52.703 に答える