在关闭另一个模式视图控制器后立即呈现一个模式视图控制器

2024-03-14

我正在解雇一个模态视图控制器,然后立即呈现另一个,但后者永远不会发生。这是代码:



 [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 来执行操作after使用完成块将模态动画移入/移出位置:

[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];
}

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

问题

事实证明UIViewController拥有公共财产,modalViewController,当presentModalViewController:animated:被调用并拆除时dismissModalViewControllerAnimated:叫做。问题是它不会被同步拆除,因此有可能在删除旧值之间产生竞争modalViewController并按以下方式设置新值。

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

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

解决方案

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

-(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:。绝对确定模式二将被呈现的唯一方法是在父视图控制器内部进行轮询,直到您完全确定self.modalViewController is nil。只有这样,弹出模态二才是“安全”的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在关闭另一个模式视图控制器后立即呈现一个模式视图控制器 的相关文章

  • valgrind 和 iOS SDK 4.2?

    使用 valgrind 运行 iOS 4 2 应用程序时遇到问题 我从 Macports 安装了 valgrind 3 6 0 SVN Xcode 3 2 5 当我修改 main 以运行 valgrind 时 我得到以下输出 Detecte
  • 在 Objective-C 中做事的正确位置

    我开始尝试使用 ObjectiveFlickr 框架 目标是创建一个相对简单的 iPhone 地图应用程序 显示当前 MKMapView 区域内带地理标记的 flickr 内容 我遇到了与线程相关的问题before https stacko
  • 使用 CoreTelephony 获取运营商名称仅返回“Carrier”

    我尝试使用此代码获取运营商名称 使用 CoreTelephony CTTelephonyNetworkInfo netinfo CTTelephonyNetworkInfo alloc init CTCarrier carrier neti
  • 自定义绘制的 UITableViewCell 中的可访问性

    当您进行自定义绘图时 UITableViewCells 滚动速度会显着提高 但是辅助功能会中断 应该如何向这样的单元添加辅助功能支持 老问题了 但 iOS 已经内置了对这种辅助功能的支持 看看UIAccessibilityContainer
  • UISlider最大值调整

    我有三个滑块 这些显示了我需要的不同元素的百分比 所有元素的最大值是 100 a b c 100 现在这些都相互依赖并有助于制作饼图 目前都可以设置为最大值 100 如何从逻辑上使这种依赖性和最大值成为可能 提前致谢 在处理滑块更改的方法中
  • 电子邮件在 ShareKit 中不起作用并且没有错误

    我正在使用 ShareKit 将 Facebook Twitter 和电子邮件共享添加到我的 iPhone 应用程序中 现在 Facebook 和 Twitter 可以使用 但电子邮件无法使用 最大的问题是没有错误或任何错误 它正常工作 但
  • 当使用 loadView 创建视图时,视图的框架大小在旋转时不会改变

    我有没有 xib 的 UIViewController 并且我正在使用 loadView 来构建创建并添加两个滚动视图的 UI 问题是 当旋转发生时 主视图框架的大小不会改变 我的意思是 我在 loadView 中设置主视图的初始帧大小 纵
  • 如何对其中包含自定义对象的 NSMutableArray 进行排序?

    我想做的事情看起来很简单 但我在网上找不到任何答案 我有一个NSMutableArray对象 假设它们是 Person 对象 我想排序NSMutableArray通过 Person birthDate 这是一个NSDate 我认为这与这个方
  • UITableView 显示的行数多于 numberOfRowsInSection 中指定的行数:

    我希望我的 tableView 显示 6 行 其中包含文本 在本例中为 示例 据我所知 我有我的numberOfSectionsInTableView and numberOfRowsInSection 设置正确 请参阅下面的示例代码 NS
  • 完成后未删除时如何重用 CABasicAnimation?

    很多人都在谈论在使用 CABasicAnimation 对象后保留它 所以通过设置 完成时删除 否 当动画完成时 动画对象保持附加到图层 在不创建新的 CABasicAnimation 的情况下 如何重新启动该动画 保留这个物体有什么意义呢
  • Windows 下 iOS 开发的替代方案 [重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 Windows 开发机为 iPhone 进行开发 https stackoverflow com questions 22358 how can i develop for iphone u
  • 保存时出现 iphone 核心数据未解决的错误

    尝试保存时 我从核心数据中收到一条奇怪的错误消息 但问题是错误不可重现 在执行不同任务时 它会在不同时间出现 错误消息 Unresolved error Domain NSCocoaErrorDomain Code 1560 UserInf
  • 我是否可以通过第三方支付网关为我的 iPhone 应用程序提供付款服务?

    所以我有一个 RESTful Api 服务 它有免费和付费的东西 任何人都可以利用我们的 API 创建 iPhone Andriod MSPhone 应用程序 不好的类比 假设我们正在为 Steam 创建一个聊天 api 服务 并且您可以为
  • 使用动画更改 UIView 背景颜色

    我想改变我的UIView带有过渡动画的背景颜色 例如 如果视图是红色的 我将其更改为蓝色 蓝色将从屏幕底部向上滑动到顶部并充满整个屏幕 我想通过制作一个来做到这一点UIView具有相同大小和所需颜色 然后将其从屏幕外一直动画到顶部 但这似乎
  • 如何在 iPhone 应用程序中播放来自服务器的视频 URL

    实际上 我通过使用从服务器获取一个网址XMLParser 我想在我的应用程序中播放这个视频网址 现在我使用了 MPMoviePlayerController 但它不起作用 请帮忙 XML解析器 m id loadXMLByURL NSStr
  • 如何确定 NSURLSessionTask 请求何时开始?

    I use NSURLSessionTask我正在尝试监视我的一些 HTTP 请求需要多长时间 我可以监视什么委托方法 或其他方法 NSURLSessionTask实际上提出了最初的请求 如果这是一个NSURLConnection里面一个N
  • iOS:在代码中访问 app-info.plist 变量

    我正在开发通用应用程序 并且希望访问代码中 app info plist 文件中存储的值 原因 我使用以下方法从故事板动态实例化 UIViewController UIStoryboard storyboard UIStoryboard s
  • ios7 绘图时出现延迟

    我有一个应用程序 在其中我正在视图上绘制一些草图 到目前为止 在我安装之前它运行良好ios7 我的应用程序使用触摸移动方法来识别运动的变化 但是当我画一条线时 触摸方法被调用 但线不会更新 直到我触摸结束ios7 所以画起来有一点点滞后 它
  • iPhone - cancelPerformSelectorWithTarget 不起作用

    如果我在 UIView 的子类中执行此操作 self performSelector selector doSomething withObject nil afterDelay 5 然后像这样取消它 我已经尝试了两个版本 NSRunLoo
  • Swift 从照片库中获取视频的 NSData

    我使用 UIImagePickerController 从我的库中选择视频 我需要提取视频文件的 NSData 我使用以下操作从我的库中选择视频 但我的数据似乎为零 但是我的 AVPlayer 播放生成的 NSURL 中的视频 所以我知道问

随机推荐