Swift 3:检查Internet(Reocurring)viewDidAppear not

Jam*_*esG 8 reachability ios swift reachability-swift

好吧,所以我对Swift很新,我对我要做的事情有点困惑,或者我是否朝着错误的方向前进.(https://github.com/ashleymills/Reachability.swift)

这是我的viewDidLoad方法:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    checkConnection()

}
Run Code Online (Sandbox Code Playgroud)

然后,我从Reachability GitHub项目中获得了一个带有代码的函数:

func checkConnection() {
    //declare this property where it won't go out of scope relative to your listener
    let reachability = Reachability()!

    reachability.whenReachable = { reachability in
        // this is called on a background thread, but UI updates must
        // be on the main thread, like this:
        DispatchQueue.main.async {
            if reachability.isReachableViaWiFi {
                print("Reachable via WiFi")
            } else {
                print("Reachable via Cellular")
            }
        }
    }
    reachability.whenUnreachable = { reachability in
        // this is called on a background thread, but UI updates must
        // be on the main thread, like this:
        DispatchQueue.main.async {

            self.dim(direction: .In, alpha: self.dimLevel, speed: self.dimSpeed)
            self.performSegue(withIdentifier: "mainToAlertNoInternet", sender:  self)
        }
    }

    do {
        try reachability.startNotifier()
    } catch {
        print("Unable to start notifier")
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,当没有互联网时,这就是代码:

self.dim(direction: .In, alpha: self.dimLevel, speed: self.dimSpeed)
            self.performSegue(withIdentifier: "mainToAlertNoInternet", sender:  self)
Run Code Online (Sandbox Code Playgroud)

Dim取自(http://www.totem.training/swift-ios-tips-tricks-tutorials-blog/ux-chops-dim-the-lights)mainToAlertNoInternet加载下一个视图而不是透明的当前视图这是一种警报风格.

所以,第二个segue上有一个视图和一个按钮.当没有互联网时,没有什么是壮观的:

在此输入图像描述

再次尝试按钮链接到Segue的Exit并在First View Controller中运行此功能:

@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) {
    dim(direction: .Out, speed: dimSpeed)
    checkInternetConnection()
}
Run Code Online (Sandbox Code Playgroud)

我添加了函数,mainToAlertNoInternet以便当他们再次单击时再次尝试,它将返回到第一个segue并再次运行测试.但是,当我再次单击尝试时,我收到此错误:

警告:尝试显示其视图不在窗口层次结构中!

希望我已经解释了我已经设置的内容.现在问题:

1)如何修复此错误?2)我是以正确的方式做到这一点还是有更好的方法?

这就是我要的:

我想在应用加载的那一刻检查互联网连接.如果没有连接,我想像我一直在做的那样显示segue.如果用户单击Try gain,我希望它返回到第一个控制器并再次运行检查,如果仍然没有连接显示segue,就像它最初再次执行一样.我希望这是一个重复的过程,直到有互联网.

感谢您的所有帮助.提前致谢

编辑:

我在ViewDidAppear方法中添加了函数调用,如下所示:

override func viewDidAppear(_ animated: Bool) {
    checkInternetConnection()
}
Run Code Online (Sandbox Code Playgroud)

但是,它没有运行.此操作时,unwindFromSecondary函数中的DIM 也不会被调用.

编辑2:

刚把这一行添加到我的viewDidAppear:

print("Appeared")
Run Code Online (Sandbox Code Playgroud)

最初会调用它,但不会再调用.

题:

在unwindSegue之后,如果所有内容再次加载,如何运行函数?

有什么想法吗?

更新3

好的,所以我看了下面的答案:

@MarkP答案工作正常.谢谢你,但@iSee的回答让我想到也许我应该以不同的方式解决这个问题.

我在这篇文章中添加了一个Bounty,以获得详细的答案,可以告诉我并解释如何实现以下目标:

在我的应用程序中 我需要在任何加载的视图上确保互联网存在(也许是一个计时器).我想它就像当前的方式,如果没有互联网,它会弹出ViewController与这个segue:

performSegue(withIdentifier: "mainToAlertNoInernet", sender: self)
Run Code Online (Sandbox Code Playgroud)

似乎App代表将成为这个地方,但我不确定如何实现这一目标.

我是iOS开发的新手,因此会欣赏一些解释和教学.

感谢您的时间.非常感谢.

Mar*_*rkP 2

正如@iSee 在链接中指出的那样。这是因为该视图尚未添加到视图层次结构中,因此您无法移动到它。为此,需要self.dismissViewControllerAnimated :

@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) {
    dim(direction: .Out, speed: dimSpeed)
    self.dismiss(animated: true) {
        self.checkInternetConnection()
    }

}
Run Code Online (Sandbox Code Playgroud)