1

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

  1. 关闭当前的模态视图(向下卷曲),然后
  2. 呈现一个新的模态视图(覆盖垂直)。

但是,当我尝试以下操作时,它只是忽略了 curl 模式视图,但不显示新的模式视图:

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

我觉得这与最后一行有关。显示 NewViewself也不起作用。我怎样才能做到这一点?

4

2 回答 2

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 之前,如果视图没有父视图控制器并且以模态方式呈现,则将返回呈现它的视图控制器。这已不再是这种情况。您可以使用 presentingViewController 属性获取呈现视图控制器。

因此更改为 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]; 
    }];
}

使用完成块来启动新的模态让我们等到旧的模态动画出来。因此,在您的第二个模态视图控制器中,您将在您的第一个模态视图控制器上调用您的自定义方法,并让它管理解除/呈现新的。

于 2012-01-06T01:11:13.903 回答
0

首先要验证的是是否self.parentViewController为 nil。

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

如果是nil(在我的测试中为 nil),您将需要在该模式视图中将指针传递给您的父级。之后你可以做这样的事情

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

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

于 2012-01-06T00:50:02.313 回答