通过performSelector:withObject将数据从一个UITableViewController连接到另一个UITableViewController:

时间:2013-09-11 00:51:11

标签: ios uitableview segue uistoryboardsegue

所以我要做的是我有一个NSMutableArray数据,我需要传递给另一个UITableViewController。此NSMutableArray是一个NSDictionaries数组,其中包含我希望在每个表视图单元格的标题中显示的信息。这是我的代码之前我的代码。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath* indexPath = [self.tableView indexPathForCell:sender];

    if ([segue.identifier isEqualToString:@"Title Query"]) {

        UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
        NSString* cellText = cell.textLabel.text;
        NSMutableArray* photosToBeShown = [self titleQuery:cellText];

          if ([segue.destinationViewController respondsToSelector:@selector(setPhotoTitles:)]) {
              [segue.destinationViewController performSelector:@selector(setPhotoTitles:) withObject: photosToBeShown];
              NSLog(@"%@", photosToBeShown);
          }      
    }

}

由performSelector调用的方法setPhotoTitles:withObject:是我正在搜索的UITableViewController上的属性(NSMutableArray *)photoTitles的setter因为我想收集数组所以我可以调用下面的方法设置我的表格视图单元格的标题。

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

    cell.textLabel.text = [self titleForRow:indexPath.row];

    return cell;
}
- (NSString *) titleForRow: (NSUInteger) row
{
    return self.photoTitles[row];
}

当我运行此代码时会发生什么事情,我最后会调用我的setter方法(setPhotoTitles :)进行无限循环。现在我的问题是解决这个问题的正确概念方法是什么,或者我如何以这种方式实现它而不会陷入无限循环。我在数组中拥有所需的所有信息,但是我需要将数组传递给新控制器,但也能够使用UITableViewCell方法设置行标题。

1 个答案:

答案 0 :(得分:1)

prepareForSegue:方法中,您应该在目标视图控制器中创建setPhotoTitles:属性,而不是覆盖NSArray,因为将photoTitles数组传递给NSArray属性目标视图控制器的。所以你的prepareForSegue方法看起来像这样:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath* indexPath = [self.tableView indexPathForCell:sender];

    if ([segue.identifier isEqualToString:@"Title Query"]) {

        UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
        NSString* cellText = cell.textLabel.text;
        NSMutableArray* photosToBeShown = [self titleQuery:cellText];

        YourCustomViewController *customViewController = segue.destinationViewController;
        customViewController.photosArrayProperty = photosToBeShown;
    }

}