【发布时间】: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