来自UIModalTransitionStylePartialCurl viewController的presentModalViewController

时间:2012-01-05 23:16:05

标签: objective-c ios uiviewcontroller uimodaltransitionstyle

我有一个通过UIModalTransitionStylePartialCurl转换呈现的模态视图。在那个模态视图中有一个按钮,我想:

  1. 取消当前的模态视图(向下卷曲),然后
  2. 提出一个新的模态视图(覆盖垂直)。
  3. 但是,当我尝试以下操作时,它只是解除了curl模态视图,但没有显示新视图:

    [self dismissModalViewControllerAnimated:YES];
    NewView *vc = [[NewView alloc] init];
    [self.parentViewController presentModalViewController:vc animated:YES];
    

    我觉得它与最后一行有关。在self上呈现NewView也不起作用。我怎么能做到这一点?

2 个答案:

答案 0 :(得分:3)

您使用的是iOS 5吗?

如果是这样,您看到的问题是由于此处记录的更改:http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/parentViewController

该链接的重要一点是:

  

在iOS 5.0之前,如果视图没有父视图控制器并且以模态方式呈现,则将返回呈现它的视图控制器。这已不再是这种情况。您可以使用presentViewController属性获取呈现视图控制器。

因此,更改为self.presentingViewController可能会解决您的问题,但可能不会。

使用第一个模式的代码:

[self dismissModalViewControllerAnimated:YES];
SecondViewController *sec = [[SecondViewController alloc] initWithNibName:nil bundle:nil];
sec.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self.presentingViewController presentModalViewController:sec animated:YES];

您没有看到新的视图控制器。

在想要使用新的(从iOS5开始)方法后获得你想要的东西:

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion

此方法是presentModalViewController的推荐替代品。

在您的第一个视图控制器上使用自定义方法,例如:

- (void)cycleModalViewControllersWithController:(UIViewController *)newViewController

这种方法既可以解除你当前的模态,也可以呈现新模态,如下所示:

- (void)cycleModalViewControllersWithController:(UIViewController *)newViewController {
    [self dismissViewControllerAnimated:YES completion:^{
        [self presentViewController:newViewController animated:YES completion:NULL]; 
    }];
}

使用完成块启动新模态让你等到旧模态动画完毕。因此,在您的第二个模态视图控制器中,您可以在第一个模态视图控制器上调用自定义方法,并让它管理解除/显示新方法。

答案 1 :(得分:0)

要验证的第一件事是self.parentViewController是否为零。

NSLog(@"parent == %@", self.parentViewController);

如果它是nil(在我的测试中它是零)你将需要在该模态视图中传递指向父项的指针。 之后你可以做这样的事情

[self.caller performSelector:@selector(launchNewView:) 
                  withObject:nil 
                  afterDelay:1.0];
[self.caller dismissModalViewControllerAnimated:YES];

这里self.caller是UIViewController在模态呈现之前设置的“父”。
我认为这不是一个完美的解决方案,但它正在我的测试中工作。