2

我有一个小问题。我正在使用导航控制器中的视图控制器开发一个简单的应用程序,如下所示:A->B->C (-> are modal segues) 视图 A 是根视图控制器,我需要从 C 回到 A。如果我从 B 调用 popToViewController 方法,A 运行 viewWillAppear;如果我从 C(到 A)调用 popToViewController,则不会调用 A 上的 viewWillAppear。我该如何解决这个问题?(在 Xcode7 和 iOS 9 上工作)

视图控制器 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];
    }
}

视图控制器 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];
}

视图控制器 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];
}
4

2 回答 2

1

如果你实现下面提供的这两种情况之一,你肯定会得到viewWillAppear并确保你用它写的正确super

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

案例 1 - 使用导航控制器

如果您想从一个 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 - 通常的周期(看起来像您需要的)
这是一个简单的案例,但您需要更加小心您的代码。你可以让父母的父母离开当前的视图控制器

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



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


UPDATE 1

Modal segues 正在创建嵌套连接(树的一行)。如果关闭 child(current) VC parent VC 会正常出现。如果您想跳转到父级的父级,只需解散父级,它将解散它的所有子 VC。我不知道为什么 popViewControllerAnimated 从 B 到 A 可以正常工作,但你不能这样做。如果您使用模态转场,只需使用dismiss。永远不要使用流行音乐。流行是推。这样做,一切都应该正常工作。

要从 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调用但viewWillAppearA 和 B中都被调用

您有 3 个曲目可供选择(实际上您还有更多曲目,例如使用委托和通知,但这太糟糕了)

  1. 坚持这个版本,但它不可靠。
  2. 继续使用情节提要,但使用 backCtoA 按钮与 VC C 中的 A 连接,因此它总是循环但每次都再次加载。不好但还可以。
  3. 最后,正确的解决方案是移动到导航控制器(顺便说一句。如果需要,您可以隐藏导航栏)并拥有 VC 堆栈,以便您可以轻松使用 popToViewController
于 2015-10-22T10:33:38.457 回答
-2

这应该是您的设计:

控制器 A -> 模态 segue 到导航控制器(控制器 B 是根视图控制器)-> 将 segue 推送到控制器 C。

因此,如果您想从 C 到 B,则执行 pop。

当你想从 B 到 A 或从 C 到 A 时,你做一个解雇。

于 2015-10-22T21:29:46.477 回答