2016-11-13 56 views
2

我正在製作一個應用程序,通過使用if語句檢測是否存在與互聯網的連接,當有互聯網時,除了沒有互聯網連接,什麼也不做,然後警告視圖說應用程序需要互聯網我管理髮現可達性,但實施我的viewDidLoad()uialertview似乎不工作。 我使用這個:檢測互聯網連接並顯示UIAlertview Swift 3

public class Reachability { 
class func isConnectedToNetwork() -> Bool { 
    var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0)) 
    zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress)) 
    zeroAddress.sin_family = sa_family_t(AF_INET) 

    let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) { 
     $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in 
      SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress) 
     } 
    } 
    var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0) 
    if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false { 
     return false 
    } 
    let isReachable = flags == .reachable 
    let needsConnection = flags == .connectionRequired 
    return isReachable && !needsConnection 
    } 
} 

然後在我的視圖控制器類:

override func viewDidLoad() { 
     if Reachability.isConnectedToNetwork() == true 
     { 
      print("Connected") 
     } 
     else 
     { 
      let controller = UIAlertController(title: "No Internet Detected", message: "This app requires an Internet connection", preferredStyle: .alert) 
      let ok = UIAlertAction(title: "OK", style: .default, handler: nil) 
      let cancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) 

      controller.addAction(ok) 
      controller.addAction(cancel) 

      present(controller, animated: true, completion: nil) 
     } 
     super.viewDidLoad() 
     //... 
    } 

,看起來像alertview不彈出 什麼建議嗎?或幫助? 謝謝

+0

嘗試。 – rmaddy

+0

@rmaddy你能詳細解釋一下嗎?即時通訊新的迅速或ios和IAM加載我所有的代碼到viewdidload()atm – killburn

+0

沒有什麼可說的。只需從'viewDidLoad'方法中移動可達性相關的代碼,並將其放入'viewDidAppear'方法中。 – rmaddy

回答

4

您必須將AlertController放置在ViewControllers生命週期的viewDidAppear方法中,因爲在方法viewDidLoad和viewWillAppear中,您當前的視圖仍然不在窗口層次中。
如果你想提出進一步ViewControllers像AlertController你需要在你的新的ViewController將變爲一個滿載的看法:

override func viewDidLoad() { 
    super.viewDidLoad() 
    //ViewControllers view not in the window hierarchy 
    // Here you could make further initialization of your views subviews 
} 

override func viewWillAppear(_ animated: Bool) { 
    //ViewControllers view ist still not in the window hierarchy 
    //This is the right place to do for instance animations on your views subviews 
} 

override func viewDidAppear(_ animated: Bool) { 
    // ViewControllers view ist fully loaded and could present further ViewController 
    //Here you could do any other UI operations 
    if Reachability.isConnectedToNetwork() == true 
    { 
     print("Connected") 
    } 
    else 
    { 
     let controller = UIAlertController(title: "No Internet Detected", message: "This app requires an Internet connection", preferredStyle: .alert) 
     let ok = UIAlertAction(title: "OK", style: .default, handler: nil) 
     let cancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) 

     controller.addAction(ok) 
     controller.addAction(cancel) 

     present(controller, animated: true, completion: nil) 
    } 

} 

這就是蘋果的文檔是怎麼說的ViewController: 的UIViewController方法被調用如下:

  • viewDidLoad中() - 創建並從故事板中加載的視圖控制器的內容視圖(其視圖層次結構的頂部 )時調用。這種方法用於初始設置。但是,由於視圖可能由於應用程序資源有限而清除了 ,因此無法保證 只會被調用一次。
  • viewWillAppear() - 適用於您希望總是在視圖變爲 之前發生的任何 操作。由於視圖的可見性可能會被其他視圖切換或遮擋,因此在屏幕上出現 內容視圖之前,總是會立即調用此方法。
  • viewDidAppear() - 適用於您希望在視圖變爲 後立即發生的任何 操作,例如獲取數據或顯示動畫。由於 視圖的可見性可能會被其他視圖切換或遮擋,因此在屏幕上內容視圖出現 之後,將始終調用此方法 。

參考:使用`viewDidAppear`,而不是`viewDidLoad` https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson4.html

+0

謝謝!有效 – killburn