好的,所以我对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并在First View Controller中运行此功能:
@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()
}
然而,它没有运行。此操作时,unwindFromSecondary
函数中的DIM也不会被调用。
只需将此行添加到我的viewDidAppear
:
print("Appeared")
最初会调用它,但不会再调用。
问题:
在unwindSegue之后,如何在所有内容再次加载后如何运行函数?
有什么想法吗?
好的,所以我看了下面的答案:
@MarkP答案很好。谢谢你 然而,@iSee的回答让我想到也许我应该以不同的方式来做这件事。
我在这篇文章中添加了一个Bounty,以获得详细的答案,可以告诉我并解释如何实现以下目标:
在我的应用中。我需要在任何加载的视图上确保互联网存在(也许是一个计时器)。我想它就像当前的方式一样,如果没有互联网,它将弹出ViewController与这个segue:
performSegue(withIdentifier: "mainToAlertNoInernet", sender: self)
App Appate似乎就是这个地方,但我不确定如何实现这一目标。
我是iOS开发的新手,因此会欣赏一些解释和教学。
感谢您的时间。非常感谢。
答案 0 :(得分:3)
我认为你是iOS开发的新手。
答案 1 :(得分:2)
正如@iSee指出的那样。这是因为视图尚未添加到视图层次结构中,因此您无法移动到该视图层次结构。对于此 self.dismissViewControllerAnimated 是必需的:
@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) {
dim(direction: .Out, speed: dimSpeed)
self.dismiss(animated: true) {
self.checkInternetConnection()
}
}
答案 2 :(得分:0)
我在app delegate - >
中使用它 func reachablityCode() {
AFNetworkReachabilityManager.sharedManager()
AFNetworkReachabilityManager.sharedManager().startMonitoring()
AFNetworkReachabilityManager.sharedManager().setReachabilityStatusChangeBlock({(status) in
let defaults = NSUserDefaults.standardUserDefaults()
if status == .NotReachable {
defaults.setBool(false, forKey:REACHABLE_KEY)
}
else {
defaults.setBool(false, forKey: REACHABLE_KEY)
}
defaults.synchronize()
})
}
然后在基本文件中 - >
func isReachable() -> Bool {
return NSUserDefaults.standardUserDefaults().boolForKey(REACHABLE_KEY)
}