模态视图控制器不会自行解散
我在做什么:
在我的应用程序中,我使用下面的代码展示了一个模态视图控制器(包含应用程序设置):
optionsViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl; [self presentModalViewController:optionsViewController animated:YES];
这个转换只是卷起视图的底部来暴露一些设置。 (请参阅“地图”应用程序中的示例。)当您点击页面的上半部分(原始视图仍然存在但灰显)时,模式视图控制器将自动解除(由操作系统处理,这个代码)。
–
什么不工作:
这在iOS 4中工作正常(我的应用程序实际上是在App Store上)。 但在iOS 5中,看起来苹果已经改变了这种转换的行为,而视图控制器不再解散自己。 我试图复制以前由操作系统处理的行为,但无法弄清楚如何。
–
我试过了:
在选项视图的顶部添加一个不可见的button不起作用。 然后页面卷起了我不想要的完整方式。
除此之外,我卡住了。 我应该如何复制原来的工作方式(或者我是从一开始就以错误的方式进行的!)。 任何帮助深表感谢!
老兄,我遇到了同样的问题..这里是我发现有关使用parentViewController:
请注意,从5.0开始,将不再返回呈现视图控制器。
这是写在UIViewController的头文件…
我正在使用ShareKit,并且modalViewController在iOS4中工作得很好,但是在iOS5中,它不会自行解散! 这是因为在他们的代码中,他们正在使用:
[[currentView parentViewController] dismissModalViewControllerAnimated:animated];
和parentViewController将返回零,因为这是一个模态提出的视图控制器…
通过寻找解决scheme,我发现你的问题。所以,我决定自己修复它:P
我改变了以前的这一行:
[currentView dismissModalViewControllerAnimated:YES];
奇迹般有效。
编辑:根据你如何解释原来的问题,有两个答案。 这是第二个:
在iOS5中,模态控制器似乎只会在您单击curl时自行解散,而不会在curl或背景之上。 在iOS5中,为了实际获取模态视图,在点击背景或者在curl上方时自行消除,我将下面的代码添加到控制器中,以便在模态视图上聆听轻敲,但忽略button的轻击。 这应该模仿以前版本的iOS在使用带页面curl的模态控制器时的行为。
- (void)viewDidLoad { UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; tap.numberOfTapsRequired = 1; tap.numberOfTouchesRequired = 1; tap.delegate = self; [backgroundView addGestureRecognizer:tap]; } - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ //change it to your condition if ([touch.view isKindOfClass:[UIButton class]]) { return NO; } return YES; } - (void)handleTap:(UITapGestureRecognizer *)sender { [self dismissModalViewControllerAnimated:YES]; }
你用什么代码来解除模态视图控制器? 我看过这样的代码:
[self.parentViewController dismissModalViewControllerAnimated: YES];
不适用于所有版本的操作系统。 但是,这个:
[self dismissModalViewControllerAnimated: YES];
应该。
我有同样的问题,也影响使用者:
[self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];
我用一个观察者来修正它,在你忽略的地方添加这个:
[[NSNotificationCenter defaultCenter] postNotificationName:@"yourObserverName" object:self];
而这在父母视图控制器中:
// add in viewDidLoad for example [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissModalVCFromParent:) name:@"yourObserverName" object: nil]; //The function - (void) dismissModalVCFromParent:(NSNotification *)notif { [self dismissModalViewControllerAnimated:YES]; } // Don't forget remove [[NSNotificationCenter defaultCenter] removeObserver:self];
这似乎在ios 5的(现在的最终版本)上工作。
我注意到,你必须点击是一个特定的区域来解除页面curl – 在屏幕的顶部边缘附近的敲击似乎没有做任何事情,但中心,页面上方curlgraphics的模糊部分始终导致解雇模态视图。
我不确定这个狭窄的自来水区域行为对于ios 5来说是新的还是已经存在,我从来没有注意过。 希望这是有帮助的!
在iOS5中,模态控制器似乎只会在您单击curl时自行解散,而不会在curl或背景之上。 在iOS5中,为了实际获取模态视图,在点击背景或者在curl上方时自行消除,我将下面的代码添加到控制器中,以便在模态视图上聆听轻敲,但忽略button的轻击。 这应该模仿以前版本的iOS在使用带页面curl的模态控制器时的行为。
- (void)viewDidLoad { UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; tap.numberOfTapsRequired = 1; tap.numberOfTouchesRequired = 1; tap.delegate = self; [backgroundView addGestureRecognizer:tap]; } - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ //change it to your condition if ([touch.view isKindOfClass:[UIButton class]]) { return NO; } return YES; } - (void)handleTap:(UITapGestureRecognizer *)sender { [self dismissModalViewControllerAnimated:YES]; }
谢谢你们,这节省了我很多时间。 我只注意到,根据UIViewControoler.h
的源代码,不推荐使用presentModalViewController
和dismissModalViewController
方法。 有替代presentViewController
和dismissViewController
方法。