我使用的是Swift 3,Xcode 8.2。
我有一个视图控制器,上面有一个按钮。按下按钮时,它将运行下面的buttonPressed
功能。它启动异步作业,需要几秒钟才能完成,在此期间会出现旋转齿轮活动指示器。一旦作业完成,我希望活动指示器被关闭,视图控制器也要关闭它最初来自的VC。
func buttonPressed() {
// Set up some stuff here
...
// this code block here is to asynchronously run the processing job
// while the activity indicator gear spins
self.displaySpinningGear()
DispatchQueue.main.async {
self.doSomeJobProcessing()
}
self.dismiss(animated: true, completion: nil)
// also dismiss the camera view
self.presentingViewController?.dismiss(animated: true, completion: nil) // error here
}
但是,我在最后一句话中收到错误:
[断言]尝试在关闭时关闭演示控制器 已经过渡了。 (< _UIAlertControllerAlertPresentationController:0x109e3b190>) 2017-03-03 21:37:56.833899 EOB-Reader [27710:6869686] [断言] transitionViewForCurrentTransition未设置,表示控制器 在演讲期间被解雇了? (< _UIAlertControllerAlertPresentationController:0x109e3b190>)
非常感谢任何帮助。
答案 0 :(得分:2)
一次执行任何过渡。
if let viewController = presentingViewController {
// This block will dismiss both current and a view controller presenting current.
viewController.dismiss(animated: true, completion: nil)
} else {
// This block will dismiss only current view controller
self.dismiss(animated: true, completion: nil)
}
无法同时执行两次转换操作。
在您的源代码中,您将使用动画解除当前视图控制器。现在动画通常需要大约0.25秒的时间才能完成其操作。
现在,在下一行中,您尝试关闭已呈现当前视图控制器的(**)视图控制器。 (在你的情况下(**)视图控制器也由一些其他视图控制器呈现。)因此,在几分之一秒/毫秒(**)内,视图控制器也会尝试用动画来解除它自我。
此时您的当前视图控制器正在被解除,并且(**)视图控制器也将启动解除操作。因此,两个操作在主执行线程上相互冲突。结果是一个问题,你正面临着。
另外,分享你的代码
self.doSomeJobProcessing()
如果您在此处设置了任何其他视图/控制器转换操作,请在此处分享。
答案 1 :(得分:0)
请记住,当您发送异步时,您通常会调度到后台线程以防止UI阻塞。需要在主线程上修改所有屏幕(UI)组件。因此,从主线程开始你的进度微调器,将繁重的工作分配到后台,然后重新发送到你想要的主线程。 this.dismissviewcontroller:动画
很快就会用代码更新。