为什么要解雇presentViewController,只关闭子控制器?

时间:2013-07-19 00:06:32

标签: ios objective-c uiviewcontroller

我已经看到了几个有关此问题,但没有人帮我解决这个问题。

我有一个MasterViewController - > AViewController - > BViewController

文档说:

呈现视图控制器负责解除它所呈现的视图控制器。但是,如果在显示的视图控制器本身上调用此方法,它会自动将消息转发给呈现视图控制器。

[self.presentingViewController dismissModalViewControllerAnimated: YES];

从我的B VC调用此方法,应该解雇我的A和B VC。然而,它只会解雇孩子(B VC)。为什么呢?

- (IBAction)checkButton:(UIButton *)sender {

    NSManagedObjectContext * context = [myAppDelegate managedObjectContext];
    Work * newWork = [NSEntityDescription insertNewObjectForEntityForName:@"Work" inManagedObjectContext:context];
    [newWork setName:_workName];
    [myAppDelegate saveContext];

    NSLog(@"%@", [self.presentingViewController description]);
    [self.presentingViewController dismissModalViewControllerAnimated: YES];

}

我不知道它是否相关,但A和B VC正如此呈现:

    TWWorkNameViewController *controller = (TWWorkNameViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"WorkName"];
    [self presentViewController:controller animated:YES completion:nil];

3 个答案:

答案 0 :(得分:2)

这是因为您的MasterViewController呈现了AViewController,这是呈现BViewController所以当您使用[self.presentingViewController dismissModalViewControllerAnimated:YES]时;你正在解雇BViewController,因为这是堆栈顶部的那个,如果你想从BViewController返回MasterViewController你可以使用Navigtioncontroller并使用方法

popToRootViewControllerAnimated: “弹出除根视图控制器之外的堆栈上的所有视图控制器并更新显示。” http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html

如果您不想使用导航控制器,则需要使用通知: 在视图中的MasterViewcontroller中加载了这样做:

- (void)viewDidLoad
{
[super viewDidLoad];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(dismiss) name:@"BACKTOINDEXNOTE" object:nil];
}

-(void)dismiss
{
  [self dismissViewControllerAnimated:YES completion:nil];
}

BViewController 你的方法里面只是说

- (IBAction)checkButton:(UIButton *)sender {
 NSNotification * notification = [NSNotification notificationWithName:@"BACKTOINDEXNOTE" object:nil];
 [[NSNotificationCenter defaultCenter] postNotification:notification];
}

因此,您将关闭BViewController和AViewController。

答案 1 :(得分:0)

我理解它的方式,“如果你在呈现的视图控制器本身上调用此方法,它会自动将消息转发给呈现的视图控制器。”指的是呈现的视图控制器本身没有呈现任何视图控制器的情况。通常情况下,呈现视图控制器负责解除它所呈现的视图控制器,但如果您在未呈现任何内容的视图控制器上调用dismissModalViewControllerAnimated,则有两个选项 - 无论是什么都不做或自行解除它。有意义的是,它通过将该消息转发给其呈现的视图控制器来解散自己。如果您在呈现另一个视图控制器的视图控制器上调用dismissModalViewControllerAnimated,那么它应该关闭该视图控制器,而不是将消息转发给它呈现视图控制器(如果有的话),如文档所示。

答案 2 :(得分:-1)

我不知道这是否是正确的答案,但是如果你有A-> B-> C并且你在C上并希望回到A,意味着同时解除C和B ,你可以使用B的presentsViewController。我用iOS 8测试了它.B和C同时被解雇,在一个动画中。

[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];