Segue(使用UIAlertController)在没有互联网连接的情况下无法正常工作

时间:2019-05-20 13:38:57

标签: ios swift segue uialertcontroller

我的应用程序(Swift 5,Xcode 10,iOS 12)从ftp服务器下载了几个文件,并将它们保存在设备上的“ Documents”文件夹中(已通过仿真器测试)并读取它们。如果没有互联网连接(通过简单地拔下Mac Mini的跳线进行测试),我的应用程序将读取现有文件。

正在登录服务器,正在读取文件,...我的应用程序显示UIAlertController(无按钮):

private func setUpProgressIndicator() {
    //Created on the main thread
    indicator = UIActivityIndicatorView(style: UIActivityIndicatorView.Style.gray)
    indicator.frame = CGRect(x: 0.0, y: 0.0, width: 40.0, height: 40.0)
    indicator.center = view.center
    view.addSubview(indicator)
    indicator.bringSubviewToFront(view)
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
    indicator.startAnimating()
    alertMessage = "- Logging in"
    alert = UIAlertController(title: "Please wait", message: alertMessage, preferredStyle: UIAlertController.Style.alert)
    self.present(alert, animated: true, completion: nil)
}

通过NavigationControllerUIViewController 1-> UIViewController 2)执行搜寻:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    print("prepare 1->2a")
    let navVC = segue.destination as? UINavigationController
    let tableVC = navVC?.viewControllers.first as! ViewController2
    print("prepare 1->2b")
    tableVC.importedData = importedData!
    print("prepare 1->2c")
}

如果连接了跳线,这将正常工作-我唯一一次检查互联网连接的时间就是UIViewController 1的开头,因为VC2并不依赖于此。如果未插入,它仍会显示“ prepare 1-> 2c”,但不会加载第二个View,而是仅显示一条错误消息(该应用不会崩溃!):

2019-05-20 14:36:23.572160+0200 myapp[2635:59029] <UIView: 0x7fa232715a50; 
frame = (0 0; 320 568); autoresize = W+H; 
layer = <CALayer: 0x60000079fb80>>'s window is not equal to 
<UIAlertController: 0x7fa23282aa00>'s view's window!

我尝试添加

alert.dismiss(animated: true, completion: nil)
indicator.stopAnimating()

prepare(),但这并不能解决问题。

如果我不使用setUpProgressIndicator(),则说服功能正常-即使没有互联网连接。

我还有别的事情来适当地解散UIAlertDialog吗?为何通过互联网连接就可以正常工作,但如果没有互联网连接就不能正常工作?

编辑:

我一直无法找出为什么会抛出此错误,但是我突然发现了为什么突然这样做了。直到昨天,我仍使用FTP库的功能来检查Internet连接:

ftpProvider?.isReachable(completionHandler: { (success, error) in
    if !success {
        readExistingFiles() //calls "prepare"
    }
})

这将检查单独线程中的连接,因此,也从单独线程中调用prepare,该线程当然会显示“ [UIView setAnimationsEnabled:]正在从后台线程中调用”警告。尽管如此,它仍然成功执行了segue。

上面的func会返回“ false”,所以我将其交换为Reachability库,该库不会像这样检查自己的线程:

if reachability.connection != .none {}

...这也意味着我的整个代码正在同步运行,而如果有Internet连接,它将使用FTP库的额外线程来下载新文件,等等。因此,当我执行此操作时,只会抛出上述错误消息正在执行主线程上的所有操作,这也阻止了segue以某种方式执行。此操作(也从UI线程调用)无论如何都不起作用:

DispatchQueue.main.async {
    self.readExistingFiles()
}

尽管如此,我仍然不明白“ ...窗口不等于...”错误消息,也不知道为什么会这样。

0 个答案:

没有答案