UINavigationController在堆栈上具有相同视图控制器的两个副本

时间:2012-02-22 19:38:50

标签: iphone objective-c ios uiviewcontroller uinavigationcontroller

我正在使用UINavigationController将UIViewController推送到堆栈中,然后当用户在表视图中选择一行时,我分配了一个新版本的视图控制器并将其推送到堆栈上这很好但是当我开始按下后退按钮,我用来存储信息的NSMutableArray似乎保留了来自堆栈的视图控制器的值。

这是将新推送到堆栈的方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    if (indexPath.section == 1) {
        if (hasLoadedResponses && [responses count] == 0) {
            return;
        }

        VideoDetailViewController_iPhone *nextView = [[VideoDetailViewController_iPhone alloc] initWithNibName:@"VideoDetailViewController_iPhone" bundle:nil withVideoArray:[responses objectAtIndex:indexPath.row]];
        nextView.navController = navController;
        [navController pushViewController:nextView animated:YES];
        [nextView release];
    }

}

我确信我遗失了一些蠢事,但现在似乎无法找到它。

1 个答案:

答案 0 :(得分:0)

假设mutable数组是[respond objectAtIndex:indexPath.row]因为是你传递给新推送视图控制器的唯一值,那么如果你要修改它,你必须考虑到同一个对象,所以修改是共享的。

你可以写:

. withVideoArray:[NSMutableArray arrayWithArray:[responses objectAtIndex:indexPath.row]];

正如我所说,我认为对象是你问题的可变数组。

另一个更智能的解决方案是将用于存储可变数组的属性定义为“copy”而不是“retain”。