PresentViewController不起作用:视图不在TabBarController的窗口层次结构中

时间:2018-06-04 09:56:25

标签: ios swift uitabbarcontroller

我创建了一个CustomAlertView。

protocol CustomAlertViewControllerDelegate{
    func retryToFetchData()
}

class CustomAlertViewController: UIViewController {

    @IBOutlet weak var alertView: UIView!
    var delegate: CustomAlertViewControllerDelegate!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.alertView.alpha = 0
        self.alertView.frame.origin.y = self.alertView.frame.origin.y + 50

        UIView.animate(withDuration: 0.4) {
            self.alertView.alpha = 1.0
            self.alertView.frame.origin.y = self.alertView.frame.origin.y - 50
        }
    }


    @IBAction func retryButton(_ sender: UIButton) {
        delegate?.retryToFetchData()
        self.dismiss(animated: true, completion: nil)
    }

}

我创建了一个静态函数来显示该视图。该视图只是一个UIViewController,它将有一个子视图,它将作为一个透明背景的popUP。

func showErrorBox(view: UIViewController, message: String, delegate: CustomAlertViewControllerDelegate){ 

    let customAlert = view.storyboard?.instantiateViewController(withIdentifier: "customAlertViewController") as! CustomAlertViewController
    customAlert.providesPresentationContextTransitionStyle = true
    customAlert.definesPresentationContext = true
    customAlert.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
    customAlert.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
    customAlert.delegate = delegate
    view.present(customAlert, animated: true, completion: nil)
}

现在,我在任何需要显示popup showErrorBox(view: self, message: message, delegate: self)的地方调用这个VC现在我的问题是我需要在一个ViewBtroller中显示这个弹出窗口,它在一个TabBarController里面,当我改变它之间的视图时UITabBar,并尝试按下重新加载按钮,应用程序抛出错误,

  

presentViewController不起作用:视图不在窗口中   层次结构

编辑: ErrorBox(popUp)上有一个Retry按钮。只有在加载错误框并且我将视图更改为不同的选项卡然后点击重新加载按钮时才会发生错误。在正常情况下,当我在同一页面时点击重新加载按钮工作正常。

我不确定是否存在问题,但是当出现错误框时,当我在标签之间更改视图时,它与此有关。

3 个答案:

答案 0 :(得分:0)

尝试self.present(customAlert, animated: true, completion: nil)而不是view.present(customAlert, animated: true, completion: nil)。如果我理解你的问题,应该有效

答案 1 :(得分:0)

解决方案,

问题是,当我在TabController中更改视图时,从窗口层次结构中删除了对customAlertView的引用。因此,只要我离开加载了TabA的TabView,就需要删除CustomAlertView。

因此,为了解决这个问题,我在CustomAlertViewController

中添加了以下代码
override func viewWillDisappear(_ animated: Bool) {
    super. viewWillDisappear(animated)
    self.dismiss(animated: true, completion: nil)
}

答案 2 :(得分:-1)

尝试获取TopMost ViewController并从中显示CustomAlertViewController而不是“self”。

将此链接指向: GetTopMostViewController