簡體   English   中英

Swift 3:檢查Internet(重復出現)viewDidAppear不會

[英]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也不會被調用。

編輯2:

剛剛將此行添加到我的viewDidAppear

print("Appeared")

最初被調用,但隨后不再調用。

題:

在unwindSegue之后再次加載所有內容后,如何使函數運行?

有什么想法嗎?

更新3

好的,所以我看了下面的答案:

@MarkP答案工作正常。 謝謝你,但是@iSee的回答讓我開始思考,也許我應該以另一種方式去做。

我已在此帖子中添加了賞金,以獲取詳細的答案,該答案可以向我展示並解釋如何實現以下目標:

在我的應用中。 我需要確保在任何加載的視圖上都存在互聯網(也許是計時器)。 我希望它像當前的方式一樣,如果沒有互聯網,它將通過以下命令彈出ViewController:

performSegue(withIdentifier: "mainToAlertNoInernet", sender: self)

似乎應該由App Delegate代替,但我不確定如何實現。

我是iOS開發的新手,因此希望您獲得一些解釋和指導。

感謝您的時間。 非常感謝。

我認為您通常是iOS開發的新手。

  1. 該警告與您的Internet連接代碼無關。

  2. 您得到的警告不是錯誤。 僅僅是警告。

  3. 你得到的原因是很好地解釋這個鏈接
  4. 要擺脫該警告,您不應從viewDidLoad調用performSegue(更多信息,請參見上面的鏈接。
  5. 要執行網絡檢查,建議使用AppDelegate(使您可以更好地控制應用程序的流程)

祝一切順利 :)

編輯:請在參考鏈接以獲得更多信息。 我可以在這里輕松地重新發布它,但是由於已經得到回答,因此您可以參考上面的鏈接,了解它為什么發生以及如何避免。

正如@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM