好吧,所以我对斯威夫特很陌生,我对我想做的事情有点困惑,或者我是不是走错了方向。(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项目中的代码进行了一个函数:
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的出口,并在第一个视图控制器中运行此函数:
@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) {
dim(direction: .Out, speed: dimSpeed)
checkInternetConnection()
}我添加了函数mainToAlertNoInternet,以便当他们再次单击“尝试”时,它将返回到第一个segue并再次运行测试。但是,当我再次单击“尝试”时,会得到以下错误:
警告:尝试显示其视图不在窗口层次结构中!
希望我已经解释了我所建立的一切。现在来回答以下问题:
( 1)我如何纠正这个错误?( 2)我这样做是正确的还是有更好的方法?
这就是我想要的:
我想要检查互联网连接的时候,该应用程序加载。如果没有连接,我想像我一直在做的那样显示这个索引。如果用户单击“尝试增益”,我希望它返回到第一个控制器并再次运行检查,如果仍然没有连接显示segue,就像它最初做的那样。我希望这是一个重复的过程,直到有互联网。
感谢你的帮助。提前感谢
编辑:
我在ViewDidAppear方法中添加了如下函数调用:
override func viewDidAppear(_ animated: Bool) {
checkInternetConnection()
}但是,它不运行。而且,当我这样做时,unwindFromSecondary函数中的DIM不会被调用。
编辑2:
刚把这行添加到我的viewDidAppear中
print("Appeared")这最初会被调用,但不会再次调用。
问题:
在unwindSegue之后重新加载了所有的东西之后,如何获得一个函数来运行呢?
有什么想法吗?
更新3
好的,我看了下面的答案:
@MarkP的答案很好。不过,谢谢你,@iSee的回答让我想,也许我应该换一种方式去做这件事。
我在这篇文章中添加了一个Bounty,以获得一个详细的答案,可以向我展示并解释如何实现以下目标:
在我的应用程序里。我需要不断地确保互联网存在于任何加载的视图上(也许是一个计时器)。我希望这样,就像当前的方式一样,如果没有互联网,它将弹出ViewController,其中包含以下内容:
performSegue(withIdentifier: "mainToAlertNoInernet", sender: self)这似乎是应用程序代表的地方,但我不知道如何实现这一点。
我是iOS开发的新手,因此希望得到一些解释和教学。
谢谢您抽时间见我。我们对此深表感谢。
发布于 2016-09-18 23:22:39
如@iSee所指出的链接。这是因为视图尚未添加到视图层次结构中,因此无法移动到它。为此,需要self.dismissViewControllerAnimated:
@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) {
dim(direction: .Out, speed: dimSpeed)
self.dismiss(animated: true) {
self.checkInternetConnection()
}
}发布于 2016-09-17 15:12:34
发布于 2016-09-19 06:24:23
我在应用程序委托->中使用了这个
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)
}https://stackoverflow.com/questions/39547851
复制相似问题