【问题标题】:PresentViewController does not work: view is not in the window hierarchy in TabBarControllerPresentViewController 不起作用:视图不在 TabBarController 的窗口层次结构中
【发布时间】:2018-06-04 09:56:25
【问题描述】:

我创建了一个 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,它有一个子视图,它将充当弹出窗口,具有透明背景。

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)
}

现在,我在需要用showErrorBox(view: self, message: message, delegate: self) 显示弹出窗口的任何地方调用此 VC 现在我的问题是当我更改 UITabBar 之间的视图时,我需要在 TabBarController 内部的 ViewController 中显示此弹出窗口,并尝试按下重新加载按钮,应用程序会抛出错误,

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

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

我不确定这个问题,但是当我在出现错误框时更改选项卡之间的视图时,这与它有关。

【问题讨论】:

  • 在 viewDidload 中调用此方法showErrorBox(view: self, message: message, delegate: self)
  • 请交叉验证标识符
  • 不,我称之为当出现问题时,可能没有可用的互联网,或者 json 解析错误,诸如此类。
  • 我认为这是正常行为,错误正在显示并且您更改标签栏控制器,然后按重试,如果再次发生错误,则意味着您正在尝试在不可见的情况下再次显示错误视图控制器,因此发生错误,您应该将警报覆盖全屏以使用户无法更改选项卡并首先消除错误
  • 显示的代码没有说明根本问题。该错误告诉您,您正在向您的 showErrorBox 方法传递一个视图控制器对象,该对象当前未在屏幕上呈现其视图(这最终意味着“不在窗口层次结构中”)。另外,请不要将视图控制器称为“视图”,这会造成混淆。 :) 他们不是一回事,远非如此。

标签: ios swift uitabbarcontroller


【解决方案1】:

尝试self.present(customAlert, animated: true, completion: nil) 而不是view.present(customAlert, animated: true, completion: nil)。如果我了解您的问题,应该可以工作

【讨论】:

  • 可以描述你为什么会这样想吗?您是否尝试过,或用类似的答案解决了类似的问题?
  • CustomAlertViewController 是当前视图控制器。如果您尝试从其他上下文打开 VC,而不是在当前 NavigationController 中,您将打开它,但不会显示。这就是为什么如果您使用当前的 NavigationBar 从 self (currentViewController) 呈现效果更好的原因。您也可以选择不同的方式,但如果是警报,您可以更深入地使用 UIWindow。用于警报的 PresentViewController 不是最佳选择)
【解决方案2】:

解决方案,

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

所以为了解决这个问题,我在CustomAlertViewController中添加了以下代码

override func viewWillDisappear(_ animated: Bool) {
    super. viewWillDisappear(animated)
    self.dismiss(animated: true, completion: nil)
}

【讨论】:

    【解决方案3】:

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

    请参考此链接: GetTopMostViewController

    【讨论】:

    • 不,这不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    相关资源
    最近更新 更多