Swift 从当前模态的委托显示UIAlertView
所讨论的问题涉及一个AddItemView,它由其代理以模态方式呈现,并包含一个tableView。当用户从tableView中选择一项时,它会触发对委托的操作。根据服务器的响应,代理可能会在当前模式的顶部显示另一个模式视图或UIAlertView 重要提示:当模式仍在屏幕上时,需要显示此UIAlertView。在用户选择后,无法取消包含tableView的modally presented视图,因为用户需要能够从表中选择多个项目,并逐个将其发送回代理进行处理 目前,UIAlerView没有显示,我怀疑这是因为已经显示的模式阻止了这一点。当代理坐在某个模态下且不忽略该模态时,是否有一种变通方法可以从代理显示UIAlertView 当代理坐在模式下时,UIAlertView当前由代理以类似方式显示:Swift 从当前模态的委托显示UIAlertView,swift,delegates,uialertview,modalviewcontroller,Swift,Delegates,Uialertview,Modalviewcontroller,所讨论的问题涉及一个AddItemView,它由其代理以模态方式呈现,并包含一个tableView。当用户从tableView中选择一项时,它会触发对委托的操作。根据服务器的响应,代理可能会在当前模式的顶部显示另一个模式视图或UIAlertView 重要提示:当模式仍在屏幕上时,需要显示此UIAlertView。在用户选择后,无法取消包含tableView的modally presented视图,因为用户需要能够从表中选择多个项目,并逐个将其发送回代理进行处理 目前,UIAlerView没有显示
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,需要保留在屏幕上-不能忽略它,因为用户需要能够从表中选择多个项目并将每个项目发送回代理。