在表视图之间传递数据

时间:2013-10-15 21:14:17

标签: ios objective-c uitableview core-data uisearchbar

我遇到了问题,我使用UITableView创建了CoreData,以便在UITableView的{​​{1}}到DetailView视图之间传递数据我用这个方法:

row

一切正常。但后来我添加了- (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,其中我保存了NSMutableArray组成NSStrings的所有cell.textLabel.text 。但是现在我需要修改prepareForSegue,以便每当我从SearchBar tableView中选择一行时执行segue

问题是要执行此类segueCoreData的关联我需要使用NSManagedObject,所以我的问题是: 如何从indexPath.row内的UISearchBar获取UITableView,并使其与indexPath.row的{​​{1}}对应(我使用的数组)要在self.data中执行正常segue,请参阅代码)? 我以为我可以比较单元格的字符串(cell.textLabel.text),但

  1. 不知道该怎么做。
  2. 如果我想有两行同名,可能会出现问题。
  3. 任何建议?

    编辑:我在故事板中添加了UISearchBar,这是我用来过滤主表视图的代码:

    UITableView

    其中- (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是我创建的数组,用于存储包含CoreDatas的NSManagedObject中的单元名称。

    我还添加了这个

    _tableData

    第一个是因为我使用了这个,我需要注册课程或者给我一个错误

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

    和第二个处理UISearchBarTableView的选择。

    在这里我按照之前的说法加载tableView

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

    修改#2:

    我写了这段代码

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

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

    当我点击UISearchBar上的一行时,它只是第一次工作!我进行搜索并单击该行,它会转到右侧的DetailView,但是如果我再次执行它会崩溃给我这个错误

    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;
    

    我认为问题是不是从indexPath.row == 0开始,而是在第一次之后创建一堆。 有什么建议吗?在此先感谢:)

1 个答案:

答案 0 :(得分: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;

     }
}