[英]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 Project中包含代碼的函數:
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通過mainToAlertNoInternet
加載當前視圖的下一個視圖因此它是一種警報樣式。
因此,第二個序列有一個視圖和一個按鈕。 當沒有互聯網時,這就是什么?
該“重試”按鈕鏈接到Segue的出口,並在First View Controller中運行此功能:
@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) {
dim(direction: .Out, speed: dimSpeed)
checkInternetConnection()
}
我在函數mainToAlertNoInternet
添加了功能,以便當他們單擊“重試”時,它將返回到第一個腳本並再次運行測試。 但是,當我單擊“重試”時,出現此錯誤:
警告:嘗試顯示不在窗口層次結構中的視圖!
希望我已經解釋了足夠的內容。 現在到問題:
1)如何解決此錯誤? 2)我是否以正確的方式進行操作?還是有更好的方法?
這就是我要的:
我想在應用加載時檢查互聯網連接。 如果沒有連接,我想像以前一樣顯示segue。 如果用戶單擊“嘗試增益”,我希望它返回第一個控制器,然后再次運行檢查,如果仍然沒有連接,則顯示連接,就像它再次開始時一樣。 在沒有互聯網之前,我希望這是一個重復的過程。
感謝您的幫助。 提前致謝
我在ViewDidAppear方法中添加了函數調用,如下所示:
override func viewDidAppear(_ animated: Bool) {
checkInternetConnection()
}
但是,它不會運行。 當我這樣做時, unwindFromSecondary
函數中的DIM也不會被調用。
剛剛將此行添加到我的viewDidAppear
:
print("Appeared")
最初被調用,但隨后不再調用。
題:
在unwindSegue之后再次加載所有內容后,如何使函數運行?
有什么想法嗎?
好的,所以我看了下面的答案:
@MarkP答案工作正常。 謝謝你,但是@iSee的回答讓我開始思考,也許我應該以另一種方式去做。
我已在此帖子中添加了賞金,以獲取詳細的答案,該答案可以向我展示並解釋如何實現以下目標:
在我的應用中。 我需要確保在任何加載的視圖上都存在互聯網(也許是計時器)。 我希望它像當前的方式一樣,如果沒有互聯網,它將通過以下命令彈出ViewController:
performSegue(withIdentifier: "mainToAlertNoInernet", sender: self)
似乎應該由App Delegate代替,但我不確定如何實現。
我是iOS開發的新手,因此希望您獲得一些解釋和指導。
感謝您的時間。 非常感謝。
正如@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)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.