我已经看到了几个有关此问题,但没有人帮我解决这个问题。
我有一个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];
答案 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];