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 didFinishLaunching
AppDelegate
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)
}
}
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 - –