我可以从 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 中定义函数并以这种方式调用它? 您只能在用户可见的视图控制器上显示警报。 它会这样工作,但我试图避免“意大利面条代码”,我试图使代码简单且易于维护和编辑以进行进一步更新,这就是为什么我创建一个单独的“功能”“视图”“警报”...等文件 您可能调用它为时过早。除非正在呈现的控制器已经出现,否则您不能呈现控制器。这意味着您不能从viewDidLoadviewWillAppear 展示它。只有在调用了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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

从 xib 内的按钮单击调用 IBAction 时出错

从 IBAction 方法调用 AudioServicesPlaySystemSound 声音时听不到声音

从 IBAction 调用的 dispatchqueue.main.async 中跳过了 Https 请求

在 Darwin 通知中心回调上调用 UIAlert

如何从objective-c中的代码调用点击手势IBAction

当从同一个组件调用时,两个 IBAction 触发的顺序是啥?