模态视图控制器不会自行解散

我在做什么:

在我的应用程序中,我使用下面的代码展示了一个模态视图控制器(包含应用程序设置):

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的源代码,不推荐使用presentModalViewControllerdismissModalViewController方法。 有替代presentViewControllerdismissViewController方法。