gpt4 book ai didi

iphone - 首先停用 UIModalTransitionStylePartialCurl 打开新的 UIVIewController

转载 作者:行者123 更新时间:2023-12-03 21:18:44 27 4
gpt4 key购买 nike

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

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

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

从文档中我得知:

A modal view presented using this transition is itself prevented from presenting any additional modal views.

当 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 ?

谢谢!

最佳答案

这里的问题是,用于呈现SecondaryViewController的代码仍在CurledViewController中执行。一种替代方法是创建一个 CurledViewControllerDelegate 协议(protocol)。将 MainViewController 设为 CurledViewController 的委托(delegate)并从 showSecondary 调用您的委托(delegate)方法。

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

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

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

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

}

编辑

为了保持新模态视图 Controller 的关闭和呈现时的动画,您需要引入一个延迟,以便有足够的时间让第一个动画完成。您可以通过使用适当的延迟值调用 performSelector:withObject:afterDelay: 来完成此操作。然而,这是一种容易出错的方法,因为它假设第一个动画始终具有相同的持续时间。

Andrew Pouliot suggested在另一个问题中,您还可以尝试在 MainViewController 中重写 viewDidAppear: ,以便它查找一个标志来确定是否应显示 secondaryViewController 。这仍然会使用我上面提到的委托(delegate)方法,但 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];
}

关于iphone - 首先停用 UIModalTransitionStylePartialCurl 打开新的 UIVIewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7031111/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com