我发现了几个有关此问题,但答案并没有解决我的问题。
我有两个使用presentModalViewController呈现的控制器。
我将modalTransitionStyle添加到主控制器调用的第一个控制器。第一个控制器正常显示第二个控制器(没有过渡方式)。
FirstVC *first = [[FirstVC alloc] initWithNibName:@"FirstVC" bundle:nil];
first.modalTransitionStyle = UIModalTransitionStylePartialCurl;
[self presentModalViewController:first animated:YES];
SecondVC *second = [[SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil];
[self presentModalViewController:second animated:YES];
这是我以前用于访问MainVC的代码:
[self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES];
这就是发生的事情:
页面没有展开。我遇到这个的原因是什么?
答案 0 :(得分:6)
在我的实验中,看起来在部分卷曲之后你不能有一个标准的演示文稿(覆盖垂直),并且同时将它们两个都解除,除非你在动画设置为NO的情况下进行解雇。
解决这个问题的方法是解除没有动画的secondVC(此代码在secondVC中):
-(IBAction)dismissSelf:(id)sender {
[self dismissViewControllerAnimated:NO completion:nil];
}
然后在firstDC中再次使用动画在viewDidAppear中解散,在测试控制器未显示之后:
-(void)viewDidAppear:(BOOL)animated {
if (![self isBeingPresented]) {
[self dismissViewControllerAnimated:YES completion:nil];
}
}
虽然上面的代码可以回到初始控制器的视图,但是你会看到firstVC的视图出现在curl uncurls之前。如果你不想看到它,那么我找到解决这个问题的唯一方法就是创建一个secondVC的图像,在解除secondVC之前将其作为(在图像视图中)添加到firstVC。所以,要做到这一点,secondVC中的代码应该是这样的(请注意,您必须链接到QuartzCore并将其导入secondVC才能使其工作):
-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
UIImage *img = [self imageWithView:self.view];
FirstViewController *first = (FirstViewController *)self.presentingViewController;
UIImageView *iv = [[UIImageView alloc] initWithFrame:first.view.bounds];
iv.image = img;
[first.view addSubview:iv];
}
-(IBAction)dismissSelf:(id)sender {
[self dismissViewControllerAnimated:NO completion:nil];
}
- (UIImage *)imageWithView:(UIView *)view {
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, [[UIScreen mainScreen] scale]);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
答案 1 :(得分:3)
您应该通过以下呼叫一个接一个地展示您的两个观点:
[self presentViewController:firstViewController animated:YES completion:^(
[self presentViewController:secondViewController animated:YES completion:^(
}];
}];
这应该表现得更好。此外,要知道您必须在之后关闭这两个viewControllers。
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:^{
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:^{
}];
}];
答案 2 :(得分:2)
看起来你在不解雇'第二'的情况下解雇'第一'。
Apple建议的方法是委托。
尝试使mainVC成为'first'的委托,这样首先可以调用mainVC的方法来解散自己。通过声明'first'的'delegate'属性并在'first'实例化时将其设置为mainVC来执行此操作。然后在first.h中定义一个'firstDelegate'协议,其中包含一些函数,如'dismissFirst',然后在mainVC中导入first.h。现在在mainVC中实现dismissFirst实际上解除'first'并做任何你想要的事情,首先要显示它。
喘气......现在以同样的方式让'第一'成为'第二'的代表,只需让'dismissSecond'函数调用mainVC的'dismissFirst'功能,所有这些功能都适合全世界。
我知道这很复杂,但委托是iOS的核心概念,这是使用它的典型例子。
以下是对其工作原理的一个很好的解释。 http://chrisrisner.com/31-Days-of-iOS--Day-6%E2%80%93The-Delegate-Pattern
我祝你好运,不要忘记了解苹果工程师心灵的内在阴谋,也就是所谓的Obj-C。
答案 3 :(得分:0)
我也有同样的疑问。我用其他方式解决了 -
步骤1:在全局类(单例)中,您可以定义变量标志。
@property (nonatomic) int flag;
第2步:假设您需要关闭second view controller
和first view controller
并返回Main view controller
,同时关闭第二个视图控制器,您可以将此值设置为假设1 即可。
[[Global sharedObject] setFlag:1];
[self.navigationController popViewControllerAnimated:YES];
第3步:使用- (void)viewWillAppear:(BOOL)animated
的{{1}}方法,您可以设置此方法 -
first view controller
我希望你的回答能够解决。如果你仍然有疑虑,你可以问。干杯:)
答案 4 :(得分:0)
- (UIViewController*)topViewController
{
UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;
while (topController.presentedViewController) {
topController = topController.presentedViewController;
}
return topController;
}
- (void)dismissAllModalController{
__block UIViewController *topController = [self topViewController];
while (topController.presentingViewController) {
[topController dismissViewControllerAnimated:NO completion:^{
}];
topController = [self topViewController];
}
}
答案 5 :(得分:0)
您需要使用unwind segue
。在要切换到的视图控制器中创建一个“空”IBAction。
@IBAction func unwindToController(segue: UIStoryboardSegue) {
}
然后转到故事板并选择您想要来自的控制器。在所选控制器顶部的图标中,最左侧应为黄色圆圈,中间有一个小白色方块,即文件所有者。 Ctrl-拖动到要展开的视图控制器的“退出”标签。退出可以在控制器树的底部附近找到,或者在故事板上找到最右边的红色正方形图像,其中带有带有右箭头的白色方块。这将弹出一个对话框,选择您创建的unwindToController
操作。
FROM控制器中将出现一个新的“Unwind segue to Exit”。双击它并给它一个标识符,例如unwindIdentifier
现在,当您要在FROM控制器中展开两个控制器时,请使用:
self.performSegueWithIdentifier("unwindIdentifier", sender:nil)
这将跳过中间控制器并展开到第二个控制器,仅在动画中显示TO控制器。