Swift 从当前模态的委托显示UIAlertView

Swift 从当前模态的委托显示UIAlertView,swift,delegates,uialertview,modalviewcontroller,Swift,Delegates,Uialertview,Modalviewcontroller,所讨论的问题涉及一个AddItemView,它由其代理以模态方式呈现,并包含一个tableView。当用户从tableView中选择一项时,它会触发对委托的操作。根据服务器的响应,代理可能会在当前模式的顶部显示另一个模式视图或UIAlertView 重要提示:当模式仍在屏幕上时,需要显示此UIAlertView。在用户选择后,无法取消包含tableView的modally presented视图,因为用户需要能够从表中选择多个项目,并逐个将其发送回代理进行处理 目前,UIAlerView没有显示

所讨论的问题涉及一个AddItemView,它由其代理以模态方式呈现,并包含一个tableView。当用户从tableView中选择一项时,它会触发对委托的操作。根据服务器的响应,代理可能会在当前模式的顶部显示另一个模式视图或UIAlertView

重要提示:当模式仍在屏幕上时,需要显示此UIAlertView。在用户选择后,无法取消包含tableView的modally presented视图,因为用户需要能够从表中选择多个项目,并逐个将其发送回代理进行处理

目前,UIAlerView没有显示,我怀疑这是因为已经显示的模式阻止了这一点。当代理坐在某个模态下且不忽略该模态时,是否有一种变通方法可以从代理显示UIAlertView

当代理坐在模式下时,UIAlertView当前由代理以类似方式显示:

var alert = UIAlertController(title: "Error", message: "Error message from server", preferredStyle: UIAlertControllerStyle.Alert)

    alert.addAction(UIAlertAction(title: "actionOne", style: .Default, handler: { action in
    // perform some action

    }))

    alert.addAction(UIAlertAction(title: "actionTwo", style: .Destructive, handler: { action in
    // perform some action

    }))

    self.presentViewController(alert, animated: true, completion: nil)
以下是委托呈现UIAlertView时返回的错误:

Warning: Attempt to present <UIAlertController: 0x156da6300> on <productionLINK_Scanner.ContainerContents: 0x156e65b20> whose view is not in the window hierarchy!

如果可能,请使用Swift提供答案。

当用户选择一个项目时,它会触发并对代表采取行动

在委托方法的开始处设置断点,该方法通过选择项触发。检查是否正在调用该委托方法

并对其进行测试。行动:行动!在

中解决:

使用了以下扩展,这要感谢GitHub上的:

extension UIApplication {

    class func topViewController(base: UIViewController? = UIApplication.sharedApplication().keyWindow?.rootViewController) -> UIViewController? {
        if let nav = base as? UINavigationController {
            return topViewController(base: nav.visibleViewController)
        }
        if let tab = base as? UITabBarController {
            if let selected = tab.selectedViewController {
                return topViewController(base: selected)
            }
        }
        if let presented = base?.presentedViewController {
            return topViewController(base: presented)
        }
        return base
    }
}
在所讨论的代理中,它是这样实现的:

var alert = UIAlertController(title: "Alert Title", message: "Message Body", preferredStyle: UIAlertControllerStyle.Alert)

alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { action in

}))

if let topController = UIApplication.topViewController(base: self) {
    topController.presentViewController(alert, animated: true, completion: nil)

} else {
    // If all else fails, attempt to present the alert from this controller.
    self.presentViewController(alert, animated: true, completion: nil)

}
这现在允许以下过程:

ContainerView作为ItemTableView的委托加载 用户单击搜索按钮 ContainerView以模式显示项目列表ItemTableView 每次用户在ItemTableView中选择一行时,都会在呈现ItemTableView的ContainerView实例中调用didSelectItem函数。ItemTableView不会被取消-用户可以继续选择项目。 ContainerView向服务器提交请求 根据响应的不同,ContainerView可能会显示UIAlertView。 alertView使用上述代码正确显示在层次结构中最顶层的任何视图的顶部。
在控制器生命周期中,您尝试在何处显示警报控制器?将一个控制器置于另一个控制器之上是没有问题的。此外,您不需要解除处理程序中的警报控制器,它将自动解除。@LeoNatan当用户在呈现模式的tableView中选择一行时,UIAlertView将从委托中呈现。需要注意的是,模式呈现的tableView实际上是嵌入到UIView中的tableView,需要保留在屏幕上-不能忽略它,因为用户需要能够从表中选择多个项目并将每个项目发送回代理。