2012-01-31 1 views
0

Я создаю NSNotification в appDelegate.NSNotification не вызывает селектор

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkRegister:) name:@"checkRegister" object:nil]; 

    return YES; 
} 

-(void)checkRegister:(NSNotification *) notification{ 

//Some code 

} 

И я отправляю уведомление в другом классе:

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"DONE. Received Bytes: %d", [webData length]); 
    NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@",theXML); 
    [theXML release]; 

    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData: webData]; 
    [xmlParser setDelegate:self]; 
    [xmlParser setShouldResolveExternalEntities: YES]; 
    [xmlParser parse]; 
    [xmlParser release]; 

    [connection release]; 
    [webData release]; 

    if(strUserName != NULL) 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"checkRegister" object:nil]; 


} 

Проблема заключается в том, что checkRegister никогда не вызывается.
Может кто-нибудь помочь мне здесь.
Спасибо,
Nitish

+0

Где находится 'strUserName'? Как вы знаете, что уведомление отправляется? Вы поставили точку останова на этой линии и подтвердили, что ее вызывают? – user1118321

+0

Он устанавливается при разборе. Это не проблема. Я не могу вызвать метод checkRegister. – Nitish

ответ

2

Какова цель Вашего уведомления @"checkRegister", у вас есть if(strUserName != NULL) чека в случае, прежде чем отправлять уведомление, но я не вижу, где вы настройки, что strUserName так определенно, попробуйте NSLog(@"%@", strUserName) , Я почти уверен, что это пусто. если это strUserName из XML-данных вашего синтаксического анализа, вы должны опубликовать уведомление после кода анализа XML, который будет в ваших методах делегирования NSXMLParser, которые вы реализуете. Какой будет one of these you use.

[xmlParser parse] не блокирует, поэтому ваш

if(strUserName != NULL) 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"checkRegister" object:nil]; 

будет называться до xmlParser завершения разбора, поэтому, ваш strUserName еще не установлено, и это причина, это ноль и ваш postNoticationName: не будет называться

EDIT:

положить

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkRegister:) name:@"checkRegister" object:nil]; 

на самом верху application:didFinishLaunchingWithOptions:, очень вероятно, что вы вывесить уведомление на главной странице до регистрации уведомления, например

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkRegister:) name:@"checkRegister" object:nil]; 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    // Override point for customization after application launch. 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
     self.mainViewController = [[[MainViewController alloc] initWithNibName:@"MainViewController_iPhone" bundle:nil] autorelease]; 
    } else { 
     self.mainViewController = [[[MainViewController alloc] initWithNibName:@"MainViewController_iPad" bundle:nil] autorelease]; 
    } 
    self.window.rootViewController = self.mainViewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

будет работать, в то время как

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    // Override point for customization after application launch. 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
     self.mainViewController = [[[MainViewController alloc] initWithNibName:@"MainViewController_iPhone" bundle:nil] autorelease]; 
    } else { 
     self.mainViewController = [[[MainViewController alloc] initWithNibName:@"MainViewController_iPad" bundle:nil] autorelease]; 
    } 
    self.window.rootViewController = self.mainViewController; 
    [self.window makeKeyAndVisible]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkRegister:) name:@"checkRegister" object:nil]; 
    return YES; 
} 

не будет работать, если ваша загрузка данных выполняется в MainControllerViewviewDidLoad метод.

+0

X Slash: Вы не понимаете мою точку зрения. Я добавляю делегат-вызов, когда создаю уведомление и добавляю checkRegister в селектор, который находится в том же классе. Но селектор никогда не называется. То, что вы говорите, также верно, но является последней частью. Во-первых, следует назвать селектор. – Nitish

+0

Селектор не будет вызываться, потому что ваше strUserName == nil. Это нуль, потому что вы настроили его в своем делегате NSXML, который во время вашего postNotificationName: еще не выполнен. Если вы мне не верите, просто удалите if (strUserName! = NULL) из вашего кода. –

+0

Я прокомментировал это. Селекционер не вызывается. – Nitish

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

  • Нет связанных вопросов^_^