2016-09-17 19 views
8

Ok, Vì vậy, tôi khá mới với Swift và tôi hơi bối rối về những gì tôi đang cố gắng làm, hoặc nếu tôi đi sai hướng. (https://github.com/ashleymills/Reachability.swift)Swift 3: Kiểm tra Internet (Định vị lại) xemDidAppear không

Đây là phương pháp viewDidLoad tôi:

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    checkConnection() 

} 

sau đó tôi có một chức năng với mã trong từ Dự án GitHub reachability:

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") 
    } 
} 

Như bạn có thể thấy, khi có không có internet, đây là mã số:

self.dim(direction: .In, alpha: self.dimLevel, speed: self.dimSpeed) 
      self.performSegue(withIdentifier: "mainToAlertNoInternet", sender: self) 

Dim là lấy từ (http://www.totem.training/swift-ios-tips-tricks-tutorials-blog/ux-chops-dim-the-lights) mainToAlertNoInternet tải chế độ xem tiếp theo so với chế độ xem hiện tại với độ trong suốt do đó nó là kiểu cảnh báo.

Vì vậy, phân đoạn thứ hai có chế độ xem và nút trên đó. Không có gì ngoạn mục này là những gì được nạp khi không có Internet:

enter image description here

Đó thử lại nút được liên kết với Exit của Segue và chạy chức năng này trong Đầu View Controller:

@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) { 
    dim(direction: .Out, speed: dimSpeed) 
    checkInternetConnection() 
} 

Tôi đã thêm vào hàm mainToAlertNoInternet để khi nhấp chuột thử lại, nó sẽ quay lại phân đoạn đầu tiên và chạy lại kiểm tra. Tuy nhiên, khi tôi nhấp vào thử lại, tôi nhận được lỗi này:

Warning: Attempt to present on whose view is not in the window hierarchy!

Hy vọng tôi đã giải thích đủ những gì tôi đã thiết lập. Bây giờ đến Câu hỏi:

1) Làm cách nào để khắc phục lỗi này? 2) Tôi có đang làm đúng cách hay có cách nào tốt hơn không?

Đây là những gì tôi muốn:

Tôi muốn kiểm tra kết nối internet vào thời điểm tải ứng dụng. Nếu không có kết nối tôi muốn hiển thị các segue như tôi đã làm. Nếu người dùng nhấp vào Hãy thử đạt được, tôi muốn nó quay trở lại bộ điều khiển đầu tiên và chạy lại kiểm tra và nếu vẫn không có kết nối hiển thị segue như nó đã ban đầu một lần nữa. Tôi muốn đây là một quá trình lặp lại cho đến khi có internet.

Đánh giá cao sự giúp đỡ của bạn. Cảm ơn trước

Edit:

Tôi đã thêm lời gọi hàm trong phương pháp viewDidAppear như vậy:

override func viewDidAppear(_ animated: Bool) { 
    checkInternetConnection() 
} 

Tuy nhiên, nó không chạy. Ngoài ra, DIM trong các chức năng unwindFromSecondary không được gọi khi tôi làm điều này.

Sửa 2:

Chỉ cần thêm dòng này vào viewDidAppear tôi:

print("Appeared") 

này được gọi là ban đầu, nhưng sau đó không một lần nữa.

Câu hỏi:

Làm cách nào để chạy một khi mọi thứ đã được tải lại sau khi giải phóng?

Mọi suy nghĩ?

Cập nhật 3

Ok, vì vậy tôi đã xem xét các câu trả lời dưới đây:

@MarkP trả lời hoạt động tốt. Cảm ơn bạn vì điều đó Tuy nhiên, câu trả lời từ @iSee đã khiến tôi nghĩ rằng có lẽ tôi nên đi theo cách này theo một cách khác.

Tôi đã thêm một Bounty bài này cho một câu trả lời chi tiết mà có thể chỉ cho tôi và giải thích làm thế nào để đạt được những điều sau đây:

Trong ứng dụng của tôi. Tôi cần phải tiếp tục đảm bảo rằng Internet tồn tại (Có thể là Bộ hẹn giờ) trên bất kỳ chế độ xem nào tải. Tôi muốn nó để như cách hiện nay, nếu không có internet, nó sẽ bật lên ViewController với segue này:

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

Dường như App Đại biểu sẽ diễn ra nhưng tôi không chắc chắn làm thế nào để đạt được điều này.

Tôi mới phát triển iOS và do đó sẽ đánh giá cao một số giải thích và giảng dạy.

Cảm ơn bạn đã dành thời gian. Được đánh giá cao.

+0

có thể trùng lặp của [có khung nhìn không nằm trong hệ thống phân cấp cửa sổ] (http://stackoverflow.com/a/12320222/2108547) –

Trả lời

2

Như @iSee đã chỉ ra các liên kết.Điều này là do chế độ xem chưa được thêm vào cấu trúc phân cấp chế độ xem nên bạn không thể di chuyển đến chế độ xem đó. cho điều này self.dismissViewControllerAnimated là cần thiết:

@IBAction func unwindFromSecondary(segue: UIStoryboardSegue) { 
    dim(direction: .Out, speed: dimSpeed) 
    self.dismiss(animated: true) { 
     self.checkInternetConnection() 
    } 

} 
3

Tôi cho rằng bạn mới phát triển iOS nói chung.

  1. Cảnh báo không liên quan gì đến mã kết nối internet của bạn.

  2. Cảnh báo bạn nhận được không phải là lỗi. Chỉ là, một cảnh báo.

  3. Lý do bạn đang nhận được giải thích trong này linkthis
  4. Để thoát khỏi cảnh báo rằng, bạn không nên gọi performSegue từ viewDidLoad (tham khảo liên kết trên để biết thêm thông tin.
  5. Thực hiện kiểm tra mạng của bạn, đó là khuyến khích sử dụng các appdelegate (cung cấp cho bạn một kiểm soát tốt hơn dòng chảy của ứng dụng)

All the best :)

EDIT: Vui lòng tham khảo đến this liên kết tại đây để biết thêm thông tin về điều này. Tôi có thể dễ dàng repost nó ở đây nhưng vì nó đã được trả lời, bạn có thể tham khảo các liên kết ở trên là tại sao nó xảy ra và làm thế nào để tránh nó.

+0

có bạn nói đúng, tôi mới làm quen với iOS Dev nói chung. Bạn có nghĩ rằng bạn có thể cụ thể hơn một chút trong những gì tôi cần làm không? – JamesG

0

tôi sử dụng này trong các đại biểu ứng dụng ->

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() 
     }) 
    } 

Và sau đó này trong tập tin cơ sở ->

func isReachable() -> Bool { 
     return NSUserDefaults.standardUserDefaults().boolForKey(REACHABLE_KEY) 
    } 
Các vấn đề liên quan