需要协助解雇模态呈现的ViewController并从UINavigationController弹出ViewController

时间:2016-03-15 09:59:29

标签: ios objective-c uistoryboard uistoryboardsegue nsnotificationcenter

enter image description here

的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应该做什么:

  1. 解雇V3。如果V3没有ViewController子类,那么它将被解除,否则不会。
  2. V2本身必须从UINavigationController弹出,但如果V3未被解除,则会弹出,但会提供日志goBackToV1
  3. 如果在V3我执行此操作NSLog(@"%@", [self presentingViewController]);,我会<UINavigationController: 0x13582d800>

    我的问题:

    1. 为什么V3在没有为其分配ViewController子类时被解雇。
    2. 为ViewProtroller子类分配时,为什么V3不会被解雇。
    3. performSegueWithIdentifier为什么V2没有将V1弹出到var image=new BitmapImage();,尽管代码已执行但其简单却被忽略了。

1 个答案:

答案 0 :(得分: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];
    }
}