我可以从 IBAction 中调用 UIAlertController [重复]
Posted
技术标签:
【中文标题】我可以从 IBAction 中调用 UIAlertController [重复]【英文标题】:can i call UIAlertController out of IBAction [duplicate] 【发布时间】:2019-04-26 17:02:08 【问题描述】:我正在尝试在我的应用上发出警报,但它不断给我如下警告并且它没有出现
Warning: Attempt to present <UIAlertController: 0x..> on <xyz.VC1: 0x..> whose view is not in the window hierarchy!
逻辑是这样的:-
(VC1) 中的IBAction
调用公共函数(X)
(X) 该函数执行一些操作和功能,并以此为基础称为公共函数(Alert)
(Alert) 该函数应该显示一个警报,但它给了我之前的警告。
注意:如果我直接从 IBAction 中使用警报,它会正常工作
显示警报:
func WAlert()
// print("Wrong :("") // to be an alert
let alert = UIAlertController(title: "S?", message: "Y", preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "C", style: UIAlertAction.Style.default, handler: _ in
//Cancel Action
))
alert.addAction(UIAlertAction(title: "out",
style: UIAlertAction.Style.default,
handler: (_: UIAlertAction!) in
//Sign out action
))
present(alert, animated: true, completion: nil)
//self.present(alert, animated: true, completion: nil)
//VC1.present(alert, animated: true, completion: nil)
【问题讨论】:
请添加您如何呈现警报的代码。 你能告诉我们使用的代码吗?另外,调用这个公共函数是否涉及任何异步线程?您是否尝试过在 VC1 中定义函数并以这种方式调用它? 您只能在用户可见的视图控制器上显示警报。 它会这样工作,但我试图避免“意大利面条代码”,我试图使代码简单且易于维护和编辑以进行进一步更新,这就是为什么我创建一个单独的“功能”“视图”“警报”...等文件 您可能调用它为时过早。除非正在呈现的控制器已经出现,否则您不能呈现控制器。这意味着您不能从viewDidLoad
或viewWillAppear
展示它。只有在调用了viewDidAppear
之后,您才能从self
呈现控制器。
【参考方案1】:
您可能需要让函数返回警报,而不是显示它,然后从 VC1 显示它 (self.present
)。正如 Teja Nandamuri 在 cmets 中提到的那样,必须从可见的UIViewController
发出警报。
根据评论修改: 您可以在单独的函数中生成警报,例如您的 WAlert,但仍将其显示在 VC1 中,甚至在 IBAction 中。例如,在您的操作中:
let alert = WAlert()
self.present(alert, animated: true)
您需要按如下方式更改 WAlert:
func WAlert() -> UIAlertController
let alert = UIAlertController(title: "S?", message: "Y", preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "C", style: UIAlertAction.Style.default, handler: _ in
//Cancel Action
))
alert.addAction(UIAlertAction(title: "out", style: UIAlertAction.Style.default, handler: (_: UIAlertAction!) in
//Sign out action
))
return alert
【讨论】:
我已经尝试显示警报,但事实证明该警报仅在 IBAction 中有效(或我的警报)以上是关于我可以从 IBAction 中调用 UIAlertController [重复]的主要内容,如果未能解决你的问题,请参考以下文章
从 IBAction 方法调用 AudioServicesPlaySystemSound 声音时听不到声音
从 IBAction 调用的 dispatchqueue.main.async 中跳过了 Https 请求