检测Internet连接并显示UIAlertview Swift 3

我正在做一个应用程序,检测是否有连接到互联网通过使用if语句,当有互联网,什么也不做,但如果没有互联网连接,然后警报视图说应用程序需要互联网我pipe理发现可达性但在我的viewDidLoad()上实现uialertview似乎不工作。 我正在使用这个:

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不会popup任何build议? 或帮助? 谢谢

您必须将AlertController放置在ViewControllers生命周期的viewDidAppear方法中,因为在方法viewDidLoad和viewWillAppear中,您当前的视图仍然不在窗口层次中。
如果你想呈现进一步的ViewController像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() – 从视图控制器创build并加载视图控制器的内容视图(视图层次结构的顶部)时调用。 此方法用于初始设置。 但是,由于视图可能因应用程序资源有限而被清除,因此不能保证只会调用一次。
  • viewWillAppear() – 用于在视图变为可见之前始终要发生的任何操作。 由于视图的可见性可能会被其他视图切换或遮挡,因此在内容视图出现在屏幕上之前,总是会立即调用此方法。
  • viewDidAppear() – 用于在视图变为可见状态时立即执行的任何操作,例如获取数据或显示animation。 由于视图的可见性可能会被其他视图切换或遮挡,因此在内容视图出现在屏幕上后,会立即调用此方法。

参考: https : //developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson4.html