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

我在做什么:

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

optionsViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl; [self presentModalViewController:optionsViewController animated:YES]; 

这个转换只是卷起视图的底部来暴露一些设置。 (请参阅“地图”应用程序中的示例。)当您点击页面的上半部分(原始视图仍然存在但灰显)时,模式视图控制器将自动解除(由操作系统处理,这个代码)。

什么不工作:

这在iOS 4中工作正常(我的应用程序实际上是在App Store上)。 但在iOS 5中,看起来苹果已经改变了这种转换的行为,而视图控制器不再解散自己。 我试图复制以前由操作系统处理的行为,但无法弄清楚如何。

我试过了:

在选项视图的顶部添加一个不可见的button不起作用。 然后页面卷起了我不想要的完整方式。

除此之外,我卡住了。 我应该如何复制原来的工作方式(或者我是从一开始就以错误的方式进行的!)。 任何帮助深表感谢!

  • 在Objective-C中,给定一个id,我怎样才能知道它指向的是什么types的对象?
  • ARC下的NSString属性应该强还是复制?
  • 如何纯粹用C编写iOS应用程序
  • UIAlertController自定义字体,大小,颜色
  • 我如何推迟1秒的方法调用?
  • Swift:自定义ViewController初始值设定项
  • 调整UIColor的alpha
  • iOS:警告“尝试呈现其视图不在窗口层次结构中的ViewController”
  • 6 Solutions collect form web for “模态视图控制器不会自行解散”

    老兄,我遇到了同样的问题..这里是我发现有关使用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方法。