pushViewController一次推送两个级别的难度

时间:2011-04-27 05:11:54

标签: objective-c cocoa-touch pushviewcontroller

我在一个视图控制器中有一个项目列表。我可以选择一个项目,并按下详细视图控制器以显示所选项目的详细信息。然后,我可以选择编辑按钮(从导航栏),并按下编辑视图控制器以允许我编辑项目的详细信息。所有这些都有效,包括取消和撤消。

在第一个列表视图控制器中,我还有一个添加按钮(在导航栏中),我可以在其中添加新记录。 (这是使用核心数据,但我不认为这与我的问题有关。)我开始通过为项目创建空白记录进行测试,当详细视图控制器出现时,所有字段都是空白的。然后我可以选择编辑按钮并编辑细节,就像它是一个已经填充的记录一样。这也有效。

我一直在尝试做的是选择添加按钮并立即按下详细视图控制器和编辑视图控制器。我想这样做的原因是当我弹出编辑视图控制器时,详细视图控制器将显示。 (然后我可以弹回列表视图控制器或再次进入编辑视图控制器。)

我遇到了麻烦。

我在列表视图控制器中尝试了两次推送,如下所示:

- (void) add {
    clientInfoTVC.clientMO = [self createNewClient];
    [self.navigationController pushViewController:clientInfoTVC animated:YES]; 
    [self.navigationController pushViewController:clientInfoTVC.clientEditTVC animated:YES]; 
}

其中clientInfoTVC.clientEditTVC指向eidt视图控制器。当我尝试添加时,这会导致SIGABRT错误并停止。

然后我尝试在第一次推送之前选择添加时在详细视图控制器中设置标志属性值,然后在详细视图控制器的viewWillAppear中进行第二次推送。出错了。我尝试将第二次推送移动到详细视图控制器的viewDidAppear,结果相同。

我迷失了这个。有人能给我一些想法如何将一个视图控制器推送到第二个视图控制器,以便我可以维护导航堆栈并弹回中间视图控制器?


@ljkyser点击部分答案。但我也发现只是将视图推送到堆栈并不会让它执行它的init,viewWillAppear和viewDidLoad。我猜测,因为所有这一切都发生在主线程上,然后推送视图只是将视图控制器排队到运行循环上。推送第二个视图控制器会从运行循环中删除第一个视图控制器,并将第二个视图控制器放入运行循环队列中。也许有人可以比我刚才更准确地验证并描述它。

在任何情况下,为了使编辑视图控制器正确初始化,我必须传递指向它的指针,以便它可以找到它正在使用的托管对象。我最初在详细视图控制器中实例化了编辑视图控制器。因此,在我原来的代码中,我正在推动一个尚未实例化的视图控制器。为了安全起见,我从列表视图控制器中实例化了它,然后确保在进行双推之前设置了所有托管对象指针,如下所示:

- (void) add {    
    Client *clientNew = [[NSEntityDescription alloc]  init];
    clientNew = [self createNewClient];
    clientInfoTVC.clientMO = clientNew;
    clientEditTVC.clientMO = clientNew;
    [clientNew release];
    [self.navigationController pushViewController:clientInfoTVC animated:NO]; 
    [self.navigationController pushViewController:clientEditTVC animated:YES]; 
}

确认@ljkyser给出的答案,我在保持第一个动画的同时尝试了这些更改:是。有了这个,导航栏看起来正确,但视图的其余部分不同步。设置动画:没有解决这个问题。

1 个答案:

答案 0 :(得分:4)

尝试将代码更改为:

- (void) add {
    clientInfoTVC.clientMO = [self createNewClient];
    [self.navigationController pushViewController:clientInfoTVC animated:NO]; 
    [self.navigationController pushViewController:clientInfoTVC.clientEditTVC animated:YES];
}

将第一个pushViewController动画参数设置为NO。

与此问题类似:Problem pushing multiple view controllers onto navigation controller stack

还有其他选择。如果需要,您可以按下并弹出特定视图控制器(UINavigationController reference)或直接编辑UINavigationController堆栈(see here)。