Swift 3:检查互联网(重复出现)viewDidAppear not
Swift 3: Checking Internet (Reocurring) viewDidAppear not
好的,所以我对 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 并再次 运行 测试。但是,当我单击重试时,出现此错误:
Warning: Attempt to present on whose view is not in the window hierarchy!
希望我已经充分解释了我的设置。现在回答问题:
1) 如何修复此错误?
2) 我这样做是正确的方法还是有更好的方法?
这就是我想要的:
我想在应用程序加载时检查互联网连接。如果没有连接,我想像我一直在做的那样显示 segue。如果用户点击 Try gain,我希望它返回到第一个控制器并再次 运行 检查,如果仍然没有连接,则像最初那样再次显示 segue。我希望这是一个重复的过程,直到有互联网为止。
感谢您的所有帮助。提前致谢
编辑:
我在 ViewDidAppear 方法中添加了函数调用,如下所示:
override func viewDidAppear(_ animated: Bool) {
checkInternetConnection()
}
然而,它不会运行。当我这样做时, unwindFromSecondary
函数中的 DIM 也不会被调用。
编辑 2:
刚刚将这一行添加到我的 viewDidAppear
:
print("Appeared")
这最初会被调用,但之后不会再次调用。
问题:
一旦在 unwindSegue 之后再次加载所有内容,我如何获得 运行 的函数?
有什么想法吗?
更新 3
好的,所以我看了下面的答案:
答案很好。谢谢你
但是, 的回答让我开始思考,也许我应该换一种方式来解决这个问题。
我已经为此 post 添加了赏金,以获得详细的答案,可以向我展示并解释如何实现以下目标:
在我的应用程序中。我需要确保在加载的任何视图上都存在互联网(也许是计时器)。我希望它像目前的方式一样,如果没有互联网,它会弹出 ViewController 和这个 segue:
performSegue(withIdentifier: "mainToAlertNoInernet", sender: self)
App Delegate 似乎是合适的地方,但我不确定如何实现。
我是 iOS 开发的新手,因此希望得到一些解释和指导。
感谢您的宝贵时间。非常感谢。
我想您一般是 iOS 开发的新手。
该警告与您的互联网连接代码无关。
您收到的警告不是错误。就是这样,一个警告。
- 你得到它的原因在这个link and this
中有很好的解释
- 要消除该警告,您不应从
viewDidLoad
调用 performSegue(有关详细信息,请参阅上述 link。
- 要执行网络检查,建议使用 AppDelegate(让您更好地控制应用程序的流量)
祝一切顺利:)
编辑:请参阅此处的 this link 了解更多信息。我可以很容易地在此处重新发布它,但由于它已经得到回答,您可以参考上面的 link 来了解它发生的原因以及如何避免它。
正如@iSee 在链接中指出的那样。这是因为视图尚未添加到视图层次结构中,因此您无法移动到它。为此需要self.dismissViewControllerAnimated:
@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) {
dim(direction: .Out, speed: dimSpeed)
self.dismiss(animated: true) {
self.checkInternetConnection()
}
}
我在应用委托中使用它 ->
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)
}
好的,所以我对 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 并再次 运行 测试。但是,当我单击重试时,出现此错误:
Warning: Attempt to present on whose view is not in the window hierarchy!
希望我已经充分解释了我的设置。现在回答问题:
1) 如何修复此错误? 2) 我这样做是正确的方法还是有更好的方法?
这就是我想要的:
我想在应用程序加载时检查互联网连接。如果没有连接,我想像我一直在做的那样显示 segue。如果用户点击 Try gain,我希望它返回到第一个控制器并再次 运行 检查,如果仍然没有连接,则像最初那样再次显示 segue。我希望这是一个重复的过程,直到有互联网为止。
感谢您的所有帮助。提前致谢
编辑:
我在 ViewDidAppear 方法中添加了函数调用,如下所示:
override func viewDidAppear(_ animated: Bool) {
checkInternetConnection()
}
然而,它不会运行。当我这样做时, unwindFromSecondary
函数中的 DIM 也不会被调用。
编辑 2:
刚刚将这一行添加到我的 viewDidAppear
:
print("Appeared")
这最初会被调用,但之后不会再次调用。
问题:
一旦在 unwindSegue 之后再次加载所有内容,我如何获得 运行 的函数?
有什么想法吗?
更新 3
好的,所以我看了下面的答案:
我已经为此 post 添加了赏金,以获得详细的答案,可以向我展示并解释如何实现以下目标:
在我的应用程序中。我需要确保在加载的任何视图上都存在互联网(也许是计时器)。我希望它像目前的方式一样,如果没有互联网,它会弹出 ViewController 和这个 segue:
performSegue(withIdentifier: "mainToAlertNoInernet", sender: self)
App Delegate 似乎是合适的地方,但我不确定如何实现。
我是 iOS 开发的新手,因此希望得到一些解释和指导。
感谢您的宝贵时间。非常感谢。
我想您一般是 iOS 开发的新手。
该警告与您的互联网连接代码无关。
您收到的警告不是错误。就是这样,一个警告。
- 你得到它的原因在这个link and this 中有很好的解释
- 要消除该警告,您不应从
viewDidLoad
调用 performSegue(有关详细信息,请参阅上述 link。 - 要执行网络检查,建议使用 AppDelegate(让您更好地控制应用程序的流量)
祝一切顺利:)
编辑:请参阅此处的 this link 了解更多信息。我可以很容易地在此处重新发布它,但由于它已经得到回答,您可以参考上面的 link 来了解它发生的原因以及如何避免它。
正如@iSee 在链接中指出的那样。这是因为视图尚未添加到视图层次结构中,因此您无法移动到它。为此需要self.dismissViewControllerAnimated:
@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) {
dim(direction: .Out, speed: dimSpeed)
self.dismiss(animated: true) {
self.checkInternetConnection()
}
}
我在应用委托中使用它 ->
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)
}