viewWillAppear在popToViewController之后没有调用

时间:2015-10-21 20:05:50

标签: ios objective-c xcode viewwillappear poptoviewcontroller

我有点问题。 我正在使用导航控制器中的视图控制器的简单应用程序,如下所示: A-> B-> C( - >是模态段) 视图A是根视图控制器,我需要从C返回A.如果我从B调用方法popToViewController,则运行viewWillAppear;如果我从C(到A)调用popToViewController,则不会调用A上的viewWillAppear。 我怎么解决这个问题? (使用Xcode7和iOS 9)

ViewController A

#import "ViewControllerA.h"
#import "ViewControllerB.h"

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self setupSceneA];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"goToB"]) {
       ViewControllerB *b = [segue destinationViewController];
    }
}

ViewController B

#import "ViewControllerB.h"
#import "ViewControllerC.h"

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self setupSceneB];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"goToC"]) {
       ViewControllerC *c = [segue destinationViewController];
    }
}

- (IBAction)backToAButton:(id)sender {
    [self dismissViewControllerAnimated:NO completion:nil];
}

ViewController C

#import "ViewControllerC.h";

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self setupSceneC];
}


- (IBAction)backToBButton:(id)sender {
    [self dismissViewControllerAnimated:NO completion:nil];
}

- (IBAction)backToAButton:(id)sender {
    [[self parentViewController] dismissViewControllerAnimated:NO completion:nil];
}

2 个答案:

答案 0 :(得分:0)

如果你实施下面提供的这两个 CASES 中的一个,你一定会得到viewWillAppear,并确保你用它super

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // Your code goes here
}

案例1 - 使用导航控制器

如果要从一个ViewController弹出到另一个ViewController,则需要将它们全部放在同一个导航堆栈中。这意味着每次您想打开新的View Controller 时,您需要执行以下操作:

 [self.navigationController pushViewController:nextVC animated:YES];

而不是这样做

[self presentViewController:nextVC animated:YES completion:nil];

之后如果您已经在同一个导航控制器中安装了所有VC,则可以使用此代码后退一步(例如从B到A,从C到B)

[self.navigationController popViewControllerAnimated:YES];

您可以使用此代码跳转到开头(例如从C到A)

[self.navigationController popToRootViewControllerAnimated:YES];


案例2 - 常规周期(看起来像你需要的)
这很简单,但您需要对代码更加小心。您可以获取父级的父级以保留当前视图控制器

[[[present presentsViewController] presentsViewController] dismissViewControllerAnimated:NO completion:nil];



注意:您不能将导航控制器功能与模态演示功能一起使用。 Push是Pop,Present是Dismiss

更新1

模态segues正在创建一个嵌套连接(树的一行)。如果你关闭子(当前)VC父VC正常出现。如果您想跳转到父母的父母,只需解雇父母,它将解雇所有孩子的VC。我不知道为什么popViewControllerAnimated从B到A工作正常,但你不允许这样做。如果你使用模态segues,只需使用dismiss。永远不要使用Pop。 Pop是Push。这样做,一切都应该正常。

要从B回到A,请将代码更改为:

[self dismissViewControllerAnimated:YES completion:nil];

要从C回到A,请使用以下代码:

[[self parentViewController] dismissViewControllerAnimated:YES completion:nil];

[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];

更新2

我发现对于STORYBOARD segues我们需要使用这个代码返回

[[[self presentingViewController] presentingViewController] dismissViewControllerAnimated:NO completion:nil];

这段代码完全从 C跳到A ,而viewWillAppear被称为BUT viewWillAppear A和B < / p>

你有3首曲目可供选择(实际上你有更多,比如使用代表和通知,但这太糟糕了)

  1. 坚持这个版本,但它不可靠。
  2. 继续使用故事板但是使用backCtoA按钮与VC C中的A连接,因此它始终循环但每次都会再次加载。不好但仍然可以。
  3. 最后,正确的解决方案是转移到导航控制器(顺便说一下,如果需要,可以隐藏导航栏)并拥有VC堆栈,这样您就可以轻松使用popToViewController

答案 1 :(得分:-2)

这应该是你的设计:

控制器A - &gt;模态segue到Nav控制器(控制器B是根视图控制器) - &gt;将segue推送到控制器C.

所以如果你想从C到B,你就做一个流行音乐。

如果你想从B到A或从C到A,你可以解雇。