有问题涉及一个AddItemView
,它由委托以模态方式呈现,并包含一个tableView。当用户从tableView中选择一个项目时,它会触发对该委托的操作。根据服务器的响应,委托可以在当前模式的顶部显示另一个模态视图或UIAlertView。
重要提示:当模态仍在屏幕上时,需要显示此UIAlertView。用户选择后,包含tableView的模态显示视图无法被删除,因为用户需要能够从表中选择多个项目,并逐个将它们发送回委托进行处理。
目前,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提供答案。
答案 0 :(得分:2)
<强>解决强>:
使用以下扩展名,感谢GitHub上的yonat:
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
searchButton
ContainerView
以模式方式显示项目列表ItemTableView
ItemTableView
中的行时,didSelectItem
函数都会在显示ContainerView
的{{1}}实例中调用。 ItemTableView
不会被解雇 - 用户可以继续选择项目。ItemTableView
向服务器提交请求ContainerView
可能会显示ContainerView
。UIAlertView
。答案 1 :(得分:0)
“当用户选择一个项目时,它会触发并对代理进行操作”
在委托方法开始时设置一个断点,该方法是通过选择项目触发的。检查是否正在调用该委托方法?
并测试它。 (ACTION :UIAlertAction!)in