Passing data between table views

蓝咒 提交于 2019-12-11 04:52:56

问题


I've got a problem, I created a UITableView using CoreData to pass data between the views (UITableView to DetailView of a row) I used this method:

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

     }
}

and everything works fine. But later I added a UISearchBar that didn't work with NSManagedObject so i created another NSMutableArray where I saved all the NSStrings composing the cell.textLabel.textand it works. But now I need to modify the prepareForSegue in order to perform a segue whenever I select a row from the SearchBar tableView.

The problem is that to perform this kind of segue connecting with the CoreData I need to use the NSManagedObject, so my question is: How can i get the indexPath.row from the UISearchBar inside my UITableView and make it correspond to the right indexPath.row of my self.data (that is the array I used to perform the normal segue in the UITableView, see code) ? I thought I could compare the strings of the cell (cell.textLabel.text) but

  1. don't know how to do.
  2. there could be a problem if there are 2 rows with same name I suppose.

any advice?

EDIT: I added the UISearchBar from the storyboard and this is the code i use to filter the main table view:

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

Where _searchDati is the array i created for the UISearchBar and _tableData is the array i created to store the name of the cells from the NSManagedObject that contains the CoreDatas.

and i also added this

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

The first because i used this and i need to register the class or gave me an error

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

and the second one to handle the selection of the UISearchBarTableView.

In here i load the tableView as i said before

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

EDIT#2:

i Wrote this code

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;

when i click on a row on the UISearchBar and it WORKS only for the first time! I make the search and click on the row and it goes to the right DetailView, but if i do it again it crashes giving me this error

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

i think the problem is that does not start from the indexPath.row == 0 but create a sort of pile after the first time. Any suggestion? Thanks in advance :)


回答1:


Try this,

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

     }
}


来源:https://stackoverflow.com/questions/19391216/passing-data-between-table-views

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!