如何从 UIAlertcontroller 关闭模态 ViewController
Posted
技术标签:
【中文标题】如何从 UIAlertcontroller 关闭模态 ViewController【英文标题】:How to dismiss modal ViewController from UIAlertcontroller 【发布时间】:2016-09-09 09:47:43 【问题描述】:我展示了一个模态viewcontroller
,用户可以在该模态上决定编辑或删除显示的汽车。
如果用户想删除这辆车,我会提出一个带有警报样式的UIAlertController
,询问他是否真的想删除这辆车。一切正常。但是在用户选择“Yes”之后,我仍然在modal viewcontroller
。
删除后如何关闭模态视图?
我尝试了以下代码
self.parentViewController?.dismissViewControllerAnimated(true, completion: nil)
和
self.navigationController?.popViewControllerAnimated(true)
在 ok Action 结束时,但两者都没有为我工作。 :(
【问题讨论】:
如何调用dismissviewcontroller视图? (父视图或导航)分享一些屏幕截图或代码。 nishith Singh 的解决方案有效吗? 不,它没有用 【参考方案1】:没有理由把代码写在
dispatch_async(dispatch_get_main_queue(), //write your code here
)
以上代码用于在主线程中工作。但是在这里你已经在主线程上。
这里的问题是你在打电话
self.parentViewController?.dismissViewControllerAnimated(true, completion: nil)
直接写就行了
self.dismissViewControllerAnimated(true, completion: nil)
因为您在self
控制器上显示AlertController
,所以唯一可以忽略它的是self
【讨论】:
请查看以下链接,这可能是您正在寻找的原因:***.com/questions/37488918/… 好的 dispatch_get_main_queue() 总是可以正常工作的。但是我们应该只在我们的线程在后台并且我们想在主线程上更改 UI 时使用,在你的链接中,他做了一个很长的操作,而且总是在后台线程中完成,而不是让 UI 改变他做到了在 dispatch_get_main_queue() 中。我们应该小心使用这个主线程块,因为主线程中的长进程可能会阻塞 UI 并挂起您的设备。 您知道 Fox 为确定按钮操作实施了哪些代码或处理。正如他已经提到的那样 self.dismissViewControllerAnimated(true, completion: nil) 对他不起作用,所以在确定按钮操作中,他有可能必须有一些在后台执行的代码,这就是为什么我建议他使用dispatch_get_main_queue()。我不明白您为什么对自己的想法如此刻板,以至于您不想了解给定解决方案起作用的可能原因。如果您不喜欢该解决方案,请自行解决。 他从未说过/提到他尝试过 self.dismissViewControllerAnimated(true, completion: nil) :) ,如果他尝试过,那么他甚至可能不会遇到这个问题。【参考方案2】:把你的代码放在里面
dispatch_async(dispatch_get_main_queue(), //write your code here
)
像这样:
func showDeleteWarningAndDeleteEntity()
dispatch_async(dispatch_get_main_queue(),
let deleteController = UIAlertController(title: "Delete car", message: "Are you sure?", preferredStyle: .Alert)
let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel)
(action) in
let okACtion = UIAlertAction(title: "Yes", style: .Destructive)
(action) in
//some network stuff happens here...
self.dismissViewControllerAnimated(true, completion: nil)
deleteController.addAction(okACtion)
deleteController.addAction(cancelAction)
self.presentViewController(deleteController, animated: true, completion: nil)
)
希望这对你有用
【讨论】:
在主线程上调度与为什么这对你有用无关。我认为你打电话给self.dismissViewControllerAnimated()
是真正解决问题的原因。
是的@Mike,你是对的。主线程不是这里的解决方案。这应该是他驳回它的方式。以上是关于如何从 UIAlertcontroller 关闭模态 ViewController的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 UINavigationController 上关闭 UIAlertController 调用关闭?
如何在 SWIFT 中不执行任何操作就关闭 UIAlertController?
我们如何在没有用户输入的情况下创建和关闭 UIAlertController? (迅速)
在 Swift 中点击返回键时如何关闭 UIAlertController?