2013-03-05 3 views
3

Мне нужно проверить, изменился ли ваш статус wifi во всем приложении. Я использую Reachability, чтобы проверить, включен ли статус wifi.Нужна NSNotification для работы через все приложение в iOS

Я настроил наблюдателя, как это:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil]; 

Проблема в том, что мне нужно добавить этот addObserver и removeObserver всем viewcontrollers и функции reachabilityChanged всем.

Есть ли лучший способ, а затем добавить NSNotification, проверяю ли я статус wifi во всем приложении?

Нужны некоторые рекомендации и предложения по этому вопросу. Благодарю.

ответ

10

сделать super viewController под названием rootViewController к subClassUIViewController и в init, чтобы инициализировать Notification и в dealloc удалить Notification

И тогда все ваши viewController должны subClass в rootViewController. Это просто OOP

как:

@interface RootViewController : UIViewController 

@end 

@implementation RootViewController 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 
- (id)init 
{ 
    self = [super init]; 
    if (self) { 

     [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil]; 

    } 
    return self; 
} 
- (void)reachabilityChanged:(NSNotification *)notification 
{ 
    // you can do nothing , it should be override. 
} 

И когда вы создающих свой ViewController, вы должны наследоваться RootViewController

@interface YourViewController : RootViewController 

- (void)reachabilityChanged:(NSNotification *)notification 
{ 
    // if your super class method do some things you should call [super reachabilityChanged:notification] 
    // do your thing. 
} 

@end 

В implementation вы должны достичь метод reachabilityChanged:

+0

В реализации вы должны достичь reachabilityChanged: метод -> смысл в RootViewController права? – lakesh

+0

@lakesh нет, это YourViewController –

+2

Хорошая идея! Но это не идеальное решение, подумайте о том, хотите ли вы наследовать от другого класса, кроме прямого наследования от UIViewController (например, UITableViewController). Возможно, лучше добавить наблюдателя уведомлений в appdelegate. Затем пройдите через все viewcontrollers в стеке viewcontroller и отправьте сообщение контроллерам view, которые могут ответить на этот метод. – onevcat

1

Я бы сделать категорию UIViewController и разоблачить методы подписки и unsu bscribe из уведомления, а также обеспечить реализацию по умолчанию того, что должно произойти в случае потери достижимости. Преимущество категории над вставкой нового класса в иерархию наследования заключается в том, что вы можете иметь подклассы контроллеров представления структуры, например. UITableViewController s, воспользуйтесь методами.

Пример категории и вид контроллера код следующим образом:

@interface UIViewController (CVReachability) 

- (void)cvObserveReachability; 
- (void)cvUnobserveReachability; 

- (void)cvHandleReachabilityNotification:(NSNotification *)notification; 

@end 

@implementation UIViewController (CVReachability) 

- (void)cvObserveReachability 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(cvHandleReachabilityNotification:) 
               name:REACHABILITY_NOTIFICATION_NAME 
               object:nil]; 
} 

- (void)cvUnobserveReachability 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:REACHABILITY_NOTIFICATION_NAME 
                object:nil]; 
} 

- (void)cvHandleReachabilityNotification:(NSNotification *)notification 
{ 
    /************************************************************* 
    * Anything that happens in this method should be appropriate for 
    * every UIViewController in your application. 
    ************************************************************/ 
    NSLog(@"Reachability notification handler: %@", notification); 
} 

@end 

@implementation ViewController 

... 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    [self cvObserveReachability]; 
} 

- (void)viewDidDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 

    [self cvUnobserveReachability]; 
} 

- (void)cvHandleReachabilityNotification:(NSNotification *)notification 
{ 
    [super cvHandleReachabilityNotification:notification]; 

    /***************************************************************** 
    * Do whatever is appropriate response for this view controller's 
    * area of responsibility. Perhaps show an alert... 
    *****************************************************************/ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Connection Problem" message:@"Maybe your internet is down?" delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil]; 
    [alert show]; 
} 

... 

@end 
+0

очень умный способ сделать это .. никогда не думал об этом ... – lakesh

+0

@lakesh Спасибо! Я часто использую это в любое время, когда буду иначе вставлять другой «абстрактный» класс ниже 'UIViewController', и он обычно окупается. –

+0

Категория состоит в том, чтобы добавить дополнительную функциональность без подкласса новых классов ... – lakesh

Смежные вопросы