2

我有三个 UIViewController:MainViewController、CurledViewController 和 SecondayViewController。

在 MainViewController 上,我在 MainViewController 中有一个 UIButton,它通过以下方式显示 CurledViewController:

curled = [[CurledViewController alloc] init];
[curled setModalTransitionStyle:UIModalTransitionStylePartialCurl];
[self presentModalViewController:curled animated:YES];

从文档中我被告知:

使用此转换呈现的模态视图本身会被阻止呈现任何其他模态视图。

当 CurledViewController 以这种方式显示时,这会阻止我打开 SecondaryViewController。我想做的是,在 CurledViewController 中选择 UIButton 时,关闭 curl 并打开 SecondaryViewController(无论是来自 CurledViewController 还是 MainViewController 的调用都没有关系)。关闭 SecondaryViewController 后,我希望重新打开 CurledViewController。

在 CurledViewController 中附加到 UIButton 的函数中,我尝试了以下方法:

- (void)showSecondary:(UIButton *)sender {
   [self.parentViewController dismissModalViewControllerAnimated:YES];
   SecondaryViewController *secondaryView = [[SecondaryViewController alloc] initWithNibName:@"Secondary" bundle:Nil];
   [self presentModalViewController:secondaryView animated:YES];
   ...
}

但我还是被告知,

Application tried to present a nested modal view controller while curled

我该如何以这种方式打开一个新的 UIViewController?

谢谢!

4

1 回答 1

1

这里的问题是您用于呈现 SecondaryViewController 的代码仍在从 CurledViewController 执行。另一种尝试的方法是创建一个 CurledViewControllerDelegate 协议。使 MainViewController 成为 CurledViewController 的委托,并从 showSecondary 调用您的委托方法。

在 CurledViewController 中,您的方法可能如下所示:

- (void)showSecondary:(UIButton *)sender {
    [self.delegate dismissCurledViewController:self];
}

在 MainViewController 中,您的委托方法可能如下所示:

- (void)dismissCurledViewController:(CurledViewController *)controller {
    [self dismissModalViewControllerAnimated:NO];
    SecondaryViewController *secondaryView = [[SecondaryViewController alloc] initWithNibName:@"Secondary" bundle:nil];
    [self presentModalViewController:secondaryView animated:YES];
    …
}

编辑

为了在新模态视图控制器的解除和显示上保持动画,您需要引入一个延迟,以便有足够的时间让第一个动画完成。performSelector:withObject:afterDelay:您可以通过使用适当的延迟值调用来做到这一点。然而,这是一种容易出错的方法,因为它假定第一个动画将始终具有相同的持续时间。

正如Andrew Pouliot在另一个问题中所建议的那样,您还可以尝试viewDidAppear:在 MainViewController 中覆盖,以便它寻找一个标志来确定是否应该显示 SecondaryViewController。这仍然会使用我上面提到的委托方法,但 MainViewController 会有以下区别:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    if(showSecondaryViewController) {
        SecondaryViewController *secondaryView = [[SecondaryViewController alloc] initWithNibName:@"Secondary" bundle:nil];
        [self presentModalViewController:secondaryView animated:YES];
    }

    showSecondaryViewController = NO;
}

- (void)dismissCurledViewController:(CurledViewController *)controller {
    showSecondaryViewController = YES;  
    [self dismissModalViewController:YES];
}
于 2011-08-11T18:49:44.087 回答