我有点问题。 我正在使用导航控制器中的视图控制器的简单应用程序,如下所示: 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];
}
答案 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)
这应该是你的设计:
控制器A - &gt;模态segue到Nav控制器(控制器B是根视图控制器) - &gt;将segue推送到控制器C.
所以如果你想从C到B,你就做一个流行音乐。
如果你想从B到A或从C到A,你可以解雇。