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

时间:2011-07-02 13:51:53

标签: iphone objective-c modalviewcontroller ios5

我在做什么:

在我的应用中,我使用以下代码呈现模态视图控制器(包含应用设置):

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

此转换只是卷起视图的底部以显示一些设置。 (请参阅“地图”应用程序中的示例。)当您点击页面的上半部分时,原始视图仍然存在但灰显,模态视图控制器将自动关闭(由操作系统处理,我没有' t代码)。

-

什么行不通:

这在iOS 4中运行良好(我的应用程序目前正在App Store上运行)。但在iOS 5中,看起来苹果已经改变了这种转变的行为,视图控制器不再自我贬低。我试图复制之前由操作系统处理的行为,但无法弄清楚如何操作。

-

我尝试了什么:

在选项视图的顶部添加隐形按钮不起作用。然后页面卷起了我不想要的全部方式。

除此之外,我被困住了。我应该如何复制它最初的工作方式(或者我从一开始就以错误的方式进行复制!)。非常感谢任何帮助!

6 个答案:

答案 0 :(得分:71)

老兄,我遇到了同样的问题..这里是我发现的使用parentViewController:

  

请注意,从5.0开始不再这样   将返回呈现视图   控制器。

这是写在UIViewController的头文件中......

我正在使用ShareKit,并且modalViewController在iOS4中完美运行,但在iOS5中,它只是不会解雇自己!这是因为在他们的代码中,他们正在使用:

    [[currentView parentViewController] dismissModalViewControllerAnimated:animated];

并且parentViewController将返回nil,因为这是一个模态呈现的视图控制器...

通过搜索解决方案,我找到了你的问题..所以,我决定自己解决这个问题:P

我将上一行更改为:

    [currentView dismissModalViewControllerAnimated:YES];

像魅力一样。


编辑:根据您对原始问题的解释方式,有两个答案。这是第二个:

在iOS5中,模态控制器似乎只在您点击卷曲时自动解散,而不是在卷曲或背景上方。在iOS5中,为了在点击背景或卷曲上方时实际获取模态视图以解除自身,我将以下代码添加到控制器,以监听模态视图上的点击,但忽略点击按钮。当使用带有页面卷曲的模态控制器时,这应该模仿iOS早期版本中的行为。

- (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];
}

答案 1 :(得分:15)

您用来解雇模态视图控制器的代码是什么?我见过这样的代码:

[self.parentViewController dismissModalViewControllerAnimated: YES];

不适用于所有版本的操作系统。但是,这个:

[self dismissModalViewControllerAnimated: YES];

应。

答案 2 :(得分:1)

我有同样的问题,也影响到使用者:

 [self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];

我用Observer修复它,将其添加到你解雇的位置:

[[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];

答案 3 :(得分:0)

这似乎适用于ios 5的(现在最终版本)。

我注意到你必须点击是一个特定的区域来消除页面卷曲 - 在屏幕顶部边缘附近轻敲似乎什么也没做,但是页面上方的模糊部分中心,模糊一致导致解雇模态视图。

我不确定这个狭窄的自来水区域行为对于ios 5来说是新的还是已经存在过,我之前从未注意过。希望这很有帮助!

答案 4 :(得分:0)

谢谢大家,这给我节省了很多时间。我刚才注意到presentModalViewControllerdismissModalViewController方法已根据UIViewControoler.h的源代码弃用。还有其他presentViewControllerdismissViewController方法。

答案 5 :(得分:0)

在iOS5中,模态控制器似乎只在您点击卷曲时自动解散,而不是在卷曲或背景上方。在iOS5中,为了在点击背景或卷曲上方时实际获取模态视图以解除自身,我将以下代码添加到控制器,以监听模态视图上的点击,但忽略点击按钮。当使用带有页面卷曲的模态控制器时,这应该模仿iOS早期版本中的行为。

- (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];
}