2017-09-10 38 views
0

用下面的代碼掙扎:夫特:UIAlertController內部而循環

var connected = false 
    while !connected { 
     let msg = "Press cancel" 
     let alert = UIAlertController(title: "Test", message: msg, preferredStyle: .alert) 
     let action = UIAlertAction(title: "Cancel", style: .default) { (action:UIAlertAction) in 
      connected = true 
     } 
     alert.addAction(action) 
     print ("Hello") 
     present(alert, animated: true, completion: nil) 

    } 
  1. 的UIAlertController從未顯示,「你好」被印刷一遍又一遍
  2. 如果我插入「連接=真」在while子句後顯示UIAlertController,但我無法通過將操作更改爲「connected = false」來顯示它

我在做什麼錯?

+2

你爲什麼老是顯示在一個無限循環報警控制器?認爲這是不合理的。保持邏輯僅在特定條件下顯示警報控制器。 –

+1

一旦你擺脫了while循環,它將不會再被執行。威廉說的是真的,請不要這樣做。 – Marcel

+0

嗯,這只是一個例子,我想要做的是用戶離開應用程序並連接到外部無線網絡,並有一個「再試一次」按鈕來檢查連接是否正常。因此,而不是「連接=真正的」我想有一個類似「如果networkOk {連接=真}如果都不行,再次顯示報警控制器... –

回答

1

首先,正如評論中提到的那樣,在一個while循環中不斷提交警報控制器並不是一個好主意。我相信您的預期功能是在connected變量爲false時顯示警報。

要做到這一點使用NotificationCenter迴應如下:

viewDidLoad

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.displayAlert), name: NSNotification.Name(rawValue: "connectionDropped"), object: nil) 

添加willSet財產觀察員connected

var connected: Bool! { 
    willSet { 
    if newValue == false && oldValue != false { 
     NotificationCenter.default.post(name: NSNotification.Name(rawValue: "connectionDropped"), object: nil) 
    } 
    } 
} 

然後,一旦你設置self.connected = false,你將運行此方法:

@objc func displayAlert() { 
    let msg = "Press cancel" 
    let alert = UIAlertController(title: "Test", message: msg, preferredStyle: .alert) 
    let action = UIAlertAction(title: "Cancel", style: .default) { (action:UIAlertAction) in 
    self.connected = true 
    } 
    alert.addAction(action) 
    print ("Hello") 
    present(alert, animated: true, completion: nil) 
} 

只要確保在加載視圖層次結構後設置了連接,例如在viewDidAppear中。

一旦你的觀點做,你可以再取出觀察者:

deinit { 
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "connectionDropped"), object: nil) 
} 

編輯:

您需要的功能設置有Reachability框架,尤其是與reachabilityChanged通知。然後,您可以使用我上面概述的類似方法致電displayAlert;這是在他們的README文檔中記錄的。

+0

此外,請確保您刪除觀察者當你與完成風景。 – Adrian

0
  1. 從未顯示的UIAlertController,「你好」打印一遍又一遍

這是不合適保持在一個無限while循環呈現警報,或許,它導致面臨「AlertController is not in the window hierarchy」問題。

  • 如果我插入「連接=真」的,同時條款則示出了UIAlertController之後,但我再次不能顯示它由 改變行動「連接=假」
  • 當然,你將不能夠在默認情況下再次顯示,在已經被執行的代碼塊。

    解決方案:

    呈現警報應該與觸發特定條件,而不是在while循環。

    舉例來說,如果你的目標是要通知該設備是未連接的用戶,你可以使用Reachability,觀察reachabilityChanged提出警告,對於更多的細節,你可以檢查庫 - 例 - 通知部分。

    0

    我設法使用遞歸調用函數來解決這個問題:

    func showDlg(){ 
        ssid = getWiFiSsid() ?? "AAA" 
        ssid = ssid[ssid.startIndex..<ssid.index(ssid.startIndex, offsetBy: 2)] 
        if ssid != "GP" { 
         print ("SSID: " + ssid) 
    
         let msg = "\nNot connected to GoPro camera\n\nPlease connect to camera wireless network and revert\n " 
         alert = UIAlertController(title: "GoPro Golfswing Analyser", message: msg, preferredStyle: .alert) 
         let action = UIAlertAction(title: "Try again", style: .default) { (action:UIAlertAction) in 
          print("Testing network again") 
          self.showDlg() 
         } 
         alert.addAction(action) 
    
         let action1 = UIAlertAction(title: "Cancel", style: .default) { (action:UIAlertAction) in 
          print("Cancel - exiting") 
    
         } 
         alert.addAction(action1) 
    
         present(alert, animated: true, completion: nil) 
    
        } else{ 
         print("Connected to GoPro") 
        } 
    
    }