在视图控制器之间移动

时间:2014-12-29 21:15:44

标签: ios objective-c uiviewcontroller

基本上我有4个普通的视图控制器,其中一个是保存主要内容的“主页”视图控制器。其他三个用于检查通知,创建新内容等。问题是这样的 - 我只想加载一次主视图控制器(当应用程序启动时),所以当我在视图控制器之间导航时,到达'home'控制器我只是用

从视图中删除当前控制器
[self dismissViewControllerAnimated:NO completion:nil];

这意味着家庭控制器必须始终保持在当前控制器之后。总结一切 - 当从家里搬到三个控制器中的任何一个时,我用

加载控制器
UIViewController *vc=[self.storyboard instantiateViewControllerWithIdentifier:@"RepliesView"];
                         [self presentViewController:vc animated:NO completion:nil];

当我从三个控制器中的任何一个移动到家时,我关闭当前的视图控制器。如果我继续在家和另一个控制器之间移动,这很好,但是当我从不在家的视图控制器移动到也不在家的视图控制器时出现问题,所以基本上在需要然后关闭电流时加载控制器一个,以便加载的那个家庭控制器直接在后面(因此可以被解雇回家)。到目前为止,我已尝试解雇然后提出

[self dismissViewControllerAnimated:NO completion:nil];
                     UIViewController *vc=[self.storyboard instantiateViewControllerWithIdentifier:@"RepliesView"];
                     [self presentViewController:vc animated:NO completion:nil];

但这会让'视图不在窗口层次结构中!'警告和显示的视图不是正在实例化的视图,而是主视图。如果有人能提出解决方案,这将是非常棒的

2 个答案:

答案 0 :(得分:0)

不是100%确定这是否有效,但请尝试一下:

[self dismissViewControllerAnimated:NO completion:^{
    UIViewController *vc=[self.storyboard instantiateViewControllerWithIdentifier:@"RepliesView"];
    [self.parentViewController presentViewController:vc animated:NO completion:nil];
}];

您遇到了问题,因为您正试图从已经被解雇的vc中提交vc。但是如果你从被解雇的vc的父vc中提出它,那可能就是这个伎俩

编辑: 也不确定这是否会有点像hacky,但它值得一试。在每个不在家的视图控制器中,将它们解除,如下所示:

[self dismissViewControllerAnimated:NO completion:^{
    UIViewController *vc=[self.storyboard instantiateViewControllerWithIdentifier:@"RepliesView"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ViewControllerDidDismiss" object:vc];
}];

在您的家庭视图控制器中,听取通知:

[[NSNotificationCenter defaultCenter] addObserverForName:@"ViewControllerDidDismiss"
                                                  object:nil
                                                   queue:[NSOperationQueue currentQueue]
                                              usingBlock:^(NSNotification *note) {
                                                  UIViewController *vc = [note object];
                                                  [self presentViewController:vc animated:NO completion:nil];
                                              }];

答案 1 :(得分:0)

我已经对此进行了一些调查并自己做了一些实验,似乎要完成你想要完成的事情,你不应该使用模态视图控制器,而应该改为将您的视图直接添加到导航堆栈。使用presentViewController:dismissViewController:代替pushViewController:popViewController

因此,为了保持代码的初衷,您可以使用以下命令从家庭视图推送到任何视图控制器:

UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"RepliesView"];
[self.navigationController pushViewController:vc animated:NO];

然后使用

解雇
[self.navigationController popViewControllerAnimated:NO];

或使用

[self.navigationController popToRootViewControllerAnimated:NO];

来自堆栈中的任何视图控制器,只要你的" home"视图控制器是根视图控制器。

然后要解雇并立即按照您当前尝试的方式进行操作,您可以推送而不是立即从保留的堆栈副本中弹出:

UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"RepliesView"];
UINavigationController *navController = self.navigationController;

[navController popViewControllerAnimated:NO];
[navController pushViewController:vc animated:NO];

并且只要您不想为转换设置动画,这应该可行。

如果您确实希望为转换设置动画,我建议您在准备好返回" home&时立即推送到vc然后执行popToRootViewControllerAnimated: #34;视图。