需要协助解除模态呈现的 ViewController 并从 UINavigationController 弹出 ViewController
Posted
技术标签:
【中文标题】需要协助解除模态呈现的 ViewController 并从 UINavigationController 弹出 ViewController【英文标题】:Need assistance dismissing modally presented ViewController and popping ViewController from UINavigationController 【发布时间】:2016-03-15 09:59:29 【问题描述】:AppDelegate
- (void)applicationWillEnterForeground:(UIApplication *)application
NSLog(@"applicationWillEnterForeground");
[[NSNotificationCenter defaultCenter]postNotificationName:@"applicationWillEnterForeground" object:nil];
V1
-(IBAction)uw:(UIStoryboardSegue*)segue
NSLog(@"Back on V1");
V2
-(void)awakeFromNib
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(goBackToV1) name:@"applicationWillEnterForeground" object:nil];
-(void)goBackToV1
NSLog(@"goBackToV1");
[self performSegueWithIdentifier:@"uwid" sender:nil];
V3
从V2
模态显示并且没有代码。
运行应用程序后,我点击主页按钮并再次打开应用程序,此触发通知并由V2
收到。
V2
应该做什么:
-
解雇
V3
。如果 V3
没有 ViewController
子类,则将其关闭,否则不会。
V2
本身必须从UINavigationController
中弹出,但如果V3
没有被解除但给出日志goBackToV1
,则不会弹出。
如果在V3
我这样做NSLog(@"%@", [self presentingViewController]);
我得到<UINavigationController: 0x13582d800>
我的问题:
-
为什么
V3
在没有分配 ViewController 子类时会被解雇。
为什么 V3
在分配 ViewController 子类时不会被解雇。
为什么 V2
上的 performSegueWithIdentifier
没有将其弹出到 V1
尽管代码已执行但其简单却被忽略了。
【问题讨论】:
【参考方案1】:首先检查V2中是否有presentedViewController
,如果有则关闭它并在完成块中执行segue,否则直接执行segue,
-(void)goBackToV1
NSLog(@"goBackToV1");
if(self.presentedViewController)
[self dismissViewControllerAnimated:YES completion:^
[self performSegueWithIdentifier:@"uwid" sender:nil];
];
else
[self performSegueWithIdentifier:@"uwid" sender:nil];
【讨论】:
感谢您解决了我的问题,请问您也可以根据我问的问题解释一下吗? 可能是因为您没有关闭 V3,因此 V2 仍然需要在视图层次结构中,因为它是 V3 的呈现视图控制器 但是为什么在情节提要中没有为 V3 分配自定义视图控制器类时会自动关闭它?以上是关于需要协助解除模态呈现的 ViewController 并从 UINavigationController 弹出 ViewController的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有委托的情况下以模态方式呈现 ViewController,然后在 ViewController 被解除后运行回调函数/块?