gpt4 book ai didi

ios - popToViewController 之后未调用 viewWillAppear

转载 作者:行者123 更新时间:2023-11-28 17:56:15 27 4
gpt4 key购买 nike

我有个小问题。我正在使用导航 Controller 中的 View Controller 开发一个简单的应用程序,如下所示:A->B->C(-> 是模态转场) View A 是 Root View Controller ,我需要从 C 返回到 A。如果我从 B 调用方法 popToViewController,A 运行 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];
}

最佳答案

如果您实现下面提供的这两个CASES 之一,您肯定会得到viewWillAppear 并确保您使用它的super 正确编写了它/p>

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

案例 1 - 使用导航 Controller

如果你想从一个 ViewController 弹出到另一个,你需要将它们都放在同一个导航堆栈中。这意味着每次你想打开新的 View Controller 你需要做这样的事情:

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

而不是这样做

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

之后,如果您已经在同一导航 Controller 中拥有所有 VC,则可以使用此代码后退一步(例如,从 B 到 A,从 C 到 B)

[self.navigationController popViewControllerAnimated:YES];

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

[self.navigationController popToRootViewControllerAnimated:YES];


案例 2 - 普通周期(看起来像您需要的)
这是一个简单的例子,但你需要更加小心你的代码。你可以让父级的父级离开当前的 View Controller

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



注意:您不能将导航 Controller 功能与模态呈现功能一起使用。 Push 是 Pop,Present 是 Dismiss


更新 1

Modal segues 正在创建一个嵌套连接(树的一行)。如果关闭子(当前)VC,则父 VC 正常出现。如果您想跳转到父级的父级,只需解雇父级,它就会解雇所有子 VC。我不知道为什么 popViewControllerAnimated 从 B 到 A 都能正常工作,但你不能那样做。如果您使用模态转场,只需使用 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 被调用但是 viewWillAppearA 和B

你有 3 个轨道可供选择(实际上你有更多,比如使用委托(delegate)和通知,但这太糟糕了)

  1. 坚持使用这个版本,但它不可靠。
  2. 继续使用 Storyboard,但使用 backCtoA 按钮连接 VC C 中的 A,因此它总是循环但每次都会重新加载。不好,但还可以。
  3. 最后,正确的解决方案是移动到导航 Controller (顺便说一句。如果需要,您可以隐藏导航栏)并拥有 VC 堆栈,以便您可以轻松使用 popToViewController

关于ios - popToViewController 之后未调用 viewWillAppear,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33268259/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com