好的,我对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 的 Exit 并在第一个视图控制器中运行此函数:
@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) {
dim(direction: .Out, speed: dimSpeed)
checkInternetConnection()
}
我添加了一个名为
mainToAlertNoInternet
的函数,这样当用户点击“再试一次”时,它将返回到第一个segue并重新运行测试。然而,当我点击“再试一次”时,我会收到以下错误信息:
希望我已经解释清楚了我所设置的内容。现在是问题:警告:尝试在未显示其视图层次结构的上呈现 !
1)我该如何修复此错误? 2)我这样做的方式正确吗?还是有更好的方法?
这是我的需求:
我想在应用程序加载时立即检查互联网连接。如果没有连接,我想像以前一样显示segue。如果用户点击“再试一次”,我希望它返回到第一个控制器并重新运行检查,如果仍然没有连接,则再次像最初那样显示segue。我希望这是一个重复的过程,直到有互联网连接。
感谢您的帮助。提前致谢。
编辑:
我已经在ViewDidAppear方法中添加了函数调用,如下所示:
override func viewDidAppear(_ animated: Bool) {
checkInternetConnection()
}
然而,它并没有运行。当我这样做时,unwindFromSecondary
函数中的 DIM 也没有被调用。
编辑2:
刚刚在我的 viewDidAppear
中添加了这一行:
print("Appeared")
这个函数最初会被调用一次,但之后不再调用。
问题:
在 unwindSegue 后,如何让一个函数在所有内容重新加载后只运行一次?
有什么想法吗?
更新3
好的,我已经查看了下面的答案:
@MarkP 的答案很好。谢谢你 然而,@iSee 的答案让我想到,也许我应该换一种方式来做这件事。
我在这篇文章中添加了一个赏金,希望能得到一个详细的答案,可以向我展示并解释如何实现以下内容:
在我的应用程序中,我需要确保在任何加载视图时都保持互联网连接存在(可能是一个计时器)。我希望像当前的方式一样,如果没有互联网,它将弹出具有此 segue 的 ViewController:
performSegue(withIdentifier: "mainToAlertNoInernet", sender: self)
看起来App Delegate是合适的位置,但我不确定如何实现。
我是iOS开发的新手,因此希望能得到一些解释和指导。
感谢您的时间。非常感激。