1

我在一个新的 iOS 4.2 项目中实现了 Apple 的 Reachability 2.2 类。我只想在设备失去网络连接时出现警报视图。(因此符合 App Store 的界面可用性要求。)我使用这个之前的 SO 问题作为我的起点。该应用程序似乎可以正确通知(当连接中断或恢复时),但我的 NS 警报视图正在循环。我认为我的错误一定是基本的,但我无法抓住它。如果在没有 NS AlertView 的情况下有更简洁的方法来做到这一点,我也对此持开放态度。我在下面的代码中留下了一些方法,但该应用程序非常简单,只有一个 ViewController。

视图控制器.h:

#import <UIKit/UIKit.h>
#import "Reachability.h"

@class Reachability;

@interface ViewController : UIViewController   {

IBOutlet UITextView *liveOutputTextView;
IBOutlet UITextView *textView;
Reachability* internetReachable;
    Reachability* hostReachable;

}

-(IBAction)action1:(id)sender;
-(IBAction)action2:(id)sender;

-(void)textFieldDidUpdate:(id)sender;
-(void)checkNetworkStatus:(NSNotification *)notice;

@end

视图控制器.m

#import "ViewController.h"
#import "Reachability.h"

@implementation ViewController

@synthesize liveOutputTextField;

- (void)checkNetworkStatus:(NSNotification *)notice

{
// called after network status changes

NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];

switch (internetStatus)

case NotReachable:
    {
        NSLog(@"The internet is inaccessible.");


        UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Internet inaccessible."
                                                         message:@"Internet inaccessible."
                                                        delegate:self
                                               cancelButtonTitle:@"Ok"  
       otherButtonTitles:nil];

        [alert show];
        [alert release];

        break;

    }
    case ReachableViaWiFi:

    {
        NSLog(@"Internet Connetion is UP.");


        UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Internet is Up"
                                                         message:@"Internet Up"
                                                        delegate:self
                                               cancelButtonTitle:@"Ok"
                                               otherButtonTitles:nil];
        [alert show];
        [alert release];

        break;
    }


    case ReachableViaWWAN:
    {
        NSLog(@"The internet is working via WWAN.");

        break;
    }

}


NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
switch (hostStatus)

{
    case NotReachable:
    {
        NSLog(@"A gateway to the host server is down.");


        UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Host is Down"
                                                         message:@"Host Down"
                                                        delegate:self
                                               cancelButtonTitle:@"Ok"
                                               otherButtonTitles:nil];
        [alert show];
        [alert release];

        break;

    }
    case ReachableViaWiFi:
    {
        NSLog(@"A gateway to the host server is working via WIFI.");

        break;

    }
    case ReachableViaWWAN:
    {
        NSLog(@"A gateway to the host server is working via WWAN.");

        break;
    }
}

}



- (void)viewDidLoad {

// check for internet connection
[[NSNotificationCenter defaultCenter] addObserver:self
                                                       selector:@selector(checkNetworkStatus:)
                                             name:kReachabilityChangedNotification
                                                     object:nil];

internetReachable = [[Reachability reachabilityForInternetConnection] retain ];
[internetReachable startNotifier];


// check if a pathway to a random host exists

hostReachable = [[Reachability reachabilityWithHostName: @"www.apple.com"]retain ];
[hostReachable startNotifier];

// now patiently wait for the notification


}

- (void)viewDidAppear:(BOOL)animated {

// check for internet connection
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];


internetReachable = [[Reachability reachabilityForInternetConnection] retain];
[internetReachable startNotifier];

// check if a pathway to a random host exists
hostReachable = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain];
[hostReachable startNotifier];

// now patiently wait for the notification

}


-(IBAction) action1:(id)sender {

// check for internet connection
[[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(checkNetworkStatus:)
                                             name:kReachabilityChangedNotification
                                           object:nil];

internetReachable = [[Reachability reachabilityForInternetConnection] retain];
[internetReachable startNotifier];

// check if a pathway to a random host exists
hostReachable = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain];
[hostReachable startNotifier];

// now patiently wait for the notification

//  ** LEFT OUT ACTUAL CODE FOR BREVITY  ** 

}

-(IBAction) action2:(id)sender {

// check for internet connection
[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(checkNetworkStatus:)
                                             name:kReachabilityChangedNotification
                                                object:nil];

internetReachable = [[Reachability reachabilityForInternetConnection] retain];
[internetReachable startNotifier];

// check if a pathway to a random host exists
hostReachable = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain];
[hostReachable startNotifier];

// now patiently wait for the notification

//  ** LEFT OUT ACTUAL CODE FOR BREVITY  ** 

}

 - (void)viewDidUnload {

// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;


  [[NSNotificationCenter defaultCenter] removeObserver:self];   
}


- (void)dealloc {

[super dealloc];

}
4

2 回答 2

1

请记住,在发送和处理通知后,需要从通知中心删除该通知。否则,每当您的可达性状态发生变化时,您都会收到警报。

例如,要删除通知,您可以执行以下操作:

[[NSNotificationCenter defaultCenter] removeObserver:self
 name:kReachabilityChangedNotification 
 object:nil];

如果需要,请记住稍后再次添加。

于 2011-01-23T20:16:40.663 回答
0

添加通知视图确实出现足以处理响应。如果您添加更多次,则回调会多次调用。

于 2013-06-22T11:50:06.150 回答