好的,所以我对 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()
}
然后我有一个函数,其中包含来自 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")
}
}
如您所见,当没有互联网时,代码如下:
self.dim(direction: .In, alpha: self.dimLevel, speed: self.dimSpeed)
self.performSegue(withIdentifier: "mainToAlertNoInternet", sender: self)
Dim 取自(http://www.totem.training/swift-ios-tips-tricks-tutorials-blog/ux-chops-dim-the-lights)mainToAlertNoInternet
以透明方式加载当前视图的下一个视图,因此这是一种警觉风格。
因此,第二个 segue 上有一个视图和一个按钮。没有什么了不起的,这是没有互联网时加载的内容:
重试按钮链接到 Segue 的退出并在第一个视图控制器中运行此功能:
@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) {
dim(direction: .Out, speed: dimSpeed)
checkInternetConnection()
}
我在函数中添加了mainToAlertNoInternet
这样当他们再次单击尝试时,它将返回到第一个 segue 并再次运行测试。但是,当我再次单击尝试时,我收到此错误:
警告:尝试呈现不在窗口层次结构中的视图!
希望我已经对我的设置进行了足够的解释。现在到问题:
1)我该如何解决这个错误?2)我这样做是正确的还是有更好的方法?
这就是我要的:
我想在应用加载时检查互联网连接。如果没有连接,我想像我一直在做的那样显示 segue。如果用户单击 Try gain,我希望它返回到第一个控制器并再次运行检查,如果仍然没有连接,则像最初一样再次显示 segue。我希望这是一个重复的过程,直到有互联网。
感谢您的所有帮助。提前致谢
编辑:
我在 ViewDidAppear 方法中添加了函数调用,如下所示:
override func viewDidAppear(_ animated: Bool) {
checkInternetConnection()
}
但是,它不运行。当我这样做时,函数中的 DIMunwindFromSecondary
也不会被调用。
编辑2:
刚刚将此行添加到我的viewDidAppear
:
print("Appeared")
最初会调用它,但不会再次调用。
问题:
在 unwindSegue 之后再次加载所有内容后,如何让函数运行?
有什么想法吗?
更新 3
好的,所以我查看了以下答案:
@MarkP答案工作正常。谢谢你但是,@iSee的回答让我想到也许我应该以不同的方式解决这个问题。
我在这篇文章中添加了一个赏金,以获得详细的答案,可以向我展示并解释如何实现以下目标:
在我的应用程序中。我需要继续确保在任何加载的视图上都存在互联网(可能是计时器)。我希望它像当前的方式一样,如果没有互联网,它将弹出带有此 segue 的 ViewController:
performSegue(withIdentifier: "mainToAlertNoInernet", sender: self)
看来 App Delegate 会是这个地方,但我不确定如何实现这一点。
我是 iOS 开发的新手,因此希望得到一些解释和教学。
感谢您的时间。非常感谢。