2017-01-01 1 views
0

J'ai un tabBarController avec 2 onglets et une classe Reachability pour la connexion Internet.Classe d'accessibilité Swift2 iOS et NSNotificatonCenter ne recevant pas de diffusion

Dans la méthode de didFinishLaunchingAppDelegate J'ai une fonction checkReachability qui vérifie la connexion réseau en cours pour voir si le wifi est activé ou désactivé et il diffusera une NSNotification au deuxième onglet dans les deux cas.

A l'intérieur du deuxième onglet il y a l'étiquette et à l'intérieur viewDidLoad il y a 2 observateurs écoutant les émissions. J'ai également 2 fonctions (déclenchées par les observateurs) qui vont changer le texte de l'étiquette en fonction de la connexion réseau actuelle.

J'utilise le simulateur et lorsque je désactive/désactive le wifi à partir du premier ou du deuxième onglet, le texte de l'étiquette de la deuxième tabulation ne change jamais.

Pourquoi le texte ne change-t-il pas et pourquoi les observateurs ne répondent-ils pas?

joignabilité Classe: Pour votre information, je me suis la joignabilité classe de cette vid youtube et je l'ai mis de Swift 3 à Swift 2.3: https://www.youtube.com/watch?v=IlsfXjESatg&t=532s

import Foundation 
import UIKit 
import SystemConfiguration 

protocol Utilities { 
} 

extension NSObject:Utilities{ 

    enum ReachabilityStatus { 
     case notReachable 
     case reachableViaWWAN 
     case reachableViaWiFi 
    } 

    var currentReachabilityStatus: ReachabilityStatus { 

     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(sizeofValue(zeroAddress)) 
     zeroAddress.sin_family = sa_family_t(AF_INET) 

     guard let defaultRouteReachability = withUnsafePointer(&zeroAddress, { 
      SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)) 
     }) else { 
      return .notReachable 
     } 

     var flags: SCNetworkReachabilityFlags = [] 
     if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) { 
      return .notReachable 
     } 

     if flags.contains(SCNetworkReachabilityFlags.Reachable) == false{ 
      // The target host is not reachable. 
      return .notReachable 
     } 
     else if flags.contains(SCNetworkReachabilityFlags.IsWWAN) == true{ 
      // WWAN connections are OK if the calling application is using the CFNetwork APIs. 
      return .reachableViaWWAN 
     } 

     else if flags.contains(.ConnectionRequired) == false { 
      // If the target host is reachable and no connection is required then we'll assume that you're on Wi-Fi... 
      return .reachableViaWiFi 
     } 
     else if (flags.contains(.ConnectionOnDemand) == true || flags.contains(.ConnectionOnTraffic) == true) && flags.contains(.InterventionRequired) == false { 
      // The connection is on-demand (or on-traffic) if the calling application is using the CFSocketStream or higher APIs and no [user] intervention is needed 
      return .reachableViaWiFi 
     } 
     else { 
      return .notReachable 
     } 
    } 
} 

AppDelegate:

class AppDelegate: UIResponder, UIApplicationDelegate { 

var window: UIWindow? 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    self.checkReachability() 

    return true 
} 
//This function is declared inside AppDelegate 
func checkReachability(){ 
    if currentReachabilityStatus == .reachableViaWiFi { 
      NSNotificationCenter.defaultCenter().postNotificationName("wifi", object: nil) 
    }else if currentReachabilityStatus == .reachableViaWWAN{ 
      print("WWAN.") 
    }else{ 
      NSNotificationCenter.defaultCenter().postNotificationName("noWifi", object: nil) 
    } 
} 

Deuxième Tab:

class SecondTabController: UIViewController { 

@IBOutlet weak var labelTwo: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(wifiConnection), name: "wifi", object: nil) 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(noConnection), name: "noWifi", object: nil) 
} 

func wifiConnection(){ 
    self.labelTwo.text = "Wifi Connection" 
} 

func noConnection(){ 
    self.labelTwo.text = "No Connection" 
} 

deinit{ 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: "wifi", object: nil) 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: "noWifi", object: nil) 
} 
} 

Répondre

1

Vous marquez la notification une seule fois au centre de notification, à savoir lorsque votre application démarre:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    // Your method `checkReachability` will post notifications: 
    self.checkReachability() 
    return true 
} 

Cependant votre SecondTabController n'a pas encore été et il est donc pas encore souscrites réception de la notification que vous envoyez au démarrage de l'application. Lorsque les notifications sont affichées, elles sont immédiatement reçues par n'importe quel abonné. Les notifications "n'attendent pas" jusqu'à ce qu'un abonné soit ajouté à un moment ultérieur. Ce dont vous avez probablement besoin en tant que gestionnaire d'accessibilité qui continue à vivre et à envoyer des notifications au centre de notifications chaque fois que l'accessibilité Wi-Fi change.

Vous pouvez utiliser les gestionnaires d'accessibilité existants, such as Alamofire's NetworkReachabilityManager as described in this question.

+0

Bumberg Merci pour le conseil et HNY! Regardez cette vidéo. Il n'utilise pas tabBar mais définit la fonction checkStatus dans didFinish (min 12:09) et a un abonné dans viewDidLoad d'un autre vc (même si l'application single vc n'est pas un onglet). Quand il bascule le wifi on/off ça marche bien (min 29:35). Si mon deuxième onglet n'est pas encore créé, une fois que je l'ai tapé, il est vivant, à ce moment-là ne devrait pas activer/désactiver le wifi alors que l'intérieur de cet onglet fonctionne comme le sien? J'ai également mis mon même code d'abonné dans tabOne car il a seulement une étiquette. Il charge immédiatement au départ et rien ne s'y passe non plus. https://youtu.be/BlBhHgoW9wM - –