gpt4 book ai didi

iphone - 关闭另一个模态视图 Controller 后立即呈现

转载 作者:IT老高 更新时间:2023-10-28 11:47:44 25 4
gpt4 key购买 nike

我正在关闭一个模态视图 Controller ,然后立即呈现另一个,但后者永远不会发生。代码如下:

 [self dismissModalViewControllerAnimated:YES]; UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; [self presentModalViewController:picker animated:YES];

第一个模态 VC 向下滑动,但新的 picker 从未出现。知道发生了什么吗?

最佳答案

2012 年 8 月更新:

iOS 5 及更高版本引入了更安全的 API 来处理模态使用完成 block 动画进入/退出位置:

[self presentViewController:myModalVC animated:YES completion:^{}];
[self dismissViewControllerAnimated:YES completion:^{}];

2012 年 8 月之前的答案:

我在关闭模态一然后快速连续呈现模态二时遇到了类似的问题。有时候情态二会在情态一被解散后显示,有时候情态二根本不会出现,这让我很伤心。

对我来说看起来像是一种竞争条件......

对呈现模态二的方法的调用者设置 1 秒以上的延迟,showModalTwo,使得模态二每次在模态一被解除后出现:

- (void)didDismissModalOne {
[self performSelector:@selector(showModalTwo:)
withObject:someNumber
afterDelay:1.0f];
}

这证实了一种怀疑,即在模态一的解雇和模态二的呈现之间存在某种竞争条件。然而,延迟调用者是不雅的,并且不能保证竞争条件在其他情况下不会再次出现。

问题

原来 UIViewControllers 有一个公共(public)属性 modalViewController,当 presentModalViewController:animated: 被调用并拆除时,它会被设置当 dismissModalViewControllerAnimated: 被调用时。问题是它不会被同步拆除,因此可能会在删除 modalViewController 的旧值和通过以下方式设置新值之间产生竞争。

  1. 现在的模态一。 myViewController.modalViewController 现在指向模态一
  2. 关闭模态一。后台进程拆除 myViewController.modalViewController 已经开始,但是 myViewController.modalViewController 仍然指向模态的一个
  3. 当前模态二,myViewController.modalViewController]现在指向模态二
  4. 系统回调触发,将 myViewController.modalViewController 设置为 nil,这会中断模态两个动画的过程,结果是用户永远看不到它。

比赛从第 2 步开始,在第 4 步显现。

解决方案

我的解决方案是在呈现模态二的方法上设置一个保护条件,以确保在尝试呈现模态二之前 myViewControoler.modalViewControllernil

-(void)showModalTwo:(NSNumber *)aParameter {

if (self.modalViewController) {
[self performSelector:@selector(showModalTwo:)
withObject:aParameter
afterDelay:0.1f];
return;
}
// You can now present the second modal safely.
}

工作就像一个魅力。更优雅的解决方案可能包括超时。

发布脚本

我真的不喜欢这个解决方案的轮询方面。 @Nimrod 建议,在这个问题的公认答案中,您可以从模态一的 viewDidDisappear: 方法安全地启动模态二的呈现。我喜欢这种事件驱动方法的声音,但是在我的用例中进行了完整的实现之后,我确认在使用 viewDidDisappear: 中的回调呈现模式 2 时,竞争条件仍然存在。唯一确定模态二会出现的方法是在父 View Controller 内部轮询,直到你完全确定 self.modalViewControllernil。只有这样,弹出模态二才“安全”。

关于iphone - 关闭另一个模态视图 Controller 后立即呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3919845/

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