从当前模态的委托中呈现UIAlertView

时间:2015-03-31 16:19:53

标签: swift delegates uialertview modalviewcontroller

有问题涉及一个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提供答案。

2 个答案:

答案 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)

}

现在允许以下过程:

  1. ContainerView作为ItemTableView
  2. 的代表加载
  3. 用户点击searchButton
  4. ContainerView以模式方式显示项目列表ItemTableView
  5. 每次使用选择ItemTableView中的行时,didSelectItem函数都会在显示ContainerView的{​​{1}}实例中调用。 ItemTableView不会被解雇 - 用户可以继续选择项目。
  6. ItemTableView向服务器提交请求
  7. 根据回复,ContainerView可能会显示ContainerView
  8. 使用上面提到的代码在层次结构中最顶层的视图之上正确显示UIAlertView

答案 1 :(得分:0)

“当用户选择一个项目时,它会触发并对代理进行操作”

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

并测试它。 (ACTION :UIAlertAction!)in