2012-02-26 2 views
0

내가 여기서 말한대로 NSNotificationCenter을 사용하고 있습니다.NSNotificationCenter가 작동하지 않습니까?

는 init 메소드에 A 급 (관찰자)에 난 가지고 :

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

제가 가지고있는 ClassB가에 :

//FILL NSDICTIONARY WITH DATA 
    [dict setObject:@"SPOT1" forKey:[array objectAtIndex:0]]; 
    [dict setObject:@"SPOT2" forKey:[array objectAtIndex:1]]; 
    [dict setObject:@"SPOT3" forKey:[array objectAtIndex:2]]; 
    [dict setObject:@"SPOT4" forKey:[array objectAtIndex:3]]; 
    [dict setObject:@"SPOT5" forKey:[array objectAtIndex:4]]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"HotSpotTouched" object:dict]; 

클래스의 함수는 getSensorsData는 없다 호출되고있다.

뭐가 잘못 됐나요 ??

감사합니다.

+0

'getSensorsData'에 대한 선언이 어떻게 생겼습니까? 그것은 당신의'.h' 인터페이스 파일에 있습니까? –

+0

@MichaelDautermann : - (void) getSensorsData : (NSNotification *) SPOTTS – Curnelious

+1

그 선언은 잠재적으로 잘못된 것 같습니다. 질문을 편집하여 선언문을 보여주고'getSensorsData' 내에서 NSDictionary에 접근하는 방법을 보여줍니다. 중단 점을 설정하고 알림이 실행되면 안타깝지 않습니까? classB가 다른 스레드에서 발생합니까? –

답변

-1

문제가 해결 : 당신이 null 인수를 전달하는 경우

은, 관찰자가 전화를받지입니다!

NSDictionary 인수가 null입니다. 이유는 알고 있기 때문에 호출이 실행되지 않습니다.

3

알림을 게시 할 때는 dictnotificationSender으로, 관찰자를 추가하면 nil으로 전달합니다. 이렇게하면 보낸 사람이 일치하지 않아 알림이 필터링되어 필터링됩니다.

업데이트 :
으로 보낸 사람 필터링이 비활성화됩니다 관찰자를 추가 할 때 전무를 전달 코멘트에 joerick에 의해 지적했다. 그래서 여기에 문제가 없습니다.

방금 ​​샘플 프로젝트를 만들었고 알림이 배달되었습니다.

@Rant : 알림과 함께 임의의 데이터를 전달하려면 userInfo 사전을 사용해야합니다 (주석에서 Cyrille가 지적한대로).

+0

그래, 그게 내가 생각했던거야. –

+2

'dict'을'NSNotification'의'object'가 아닌'userData'로 게시하고 싶습니다. – Cyrille

+1

'addObserver : ... '에'nil'을 넘겨 주면 발신자와 상관없이 모든 알림을 볼 수 있습니다. https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html – joerick

3

알림 센터에 대한 호출이 올바른 것처럼 보입니다. 문제가 객체 A의 지연주기 때문인 것으로 의심됩니다. init 메소드의 알림을 등록한다고합니다. ? 올바르게 self을 할당 :

-(id)init 
{ 
    //self does not have a meaningful value prior to the call to [super init] 
    self = [super init]; 
    if (self != nil) 
    { 
     //ensure addObserver is called in the if code block 
    } 
    return self; 
} 

또한, 그들이 오타에 대해 완화로 알림 이름에 대한 상수를 사용하는 것이 좋은 방법입니다. Constants in Objective C을 참조하십시오.

+0

답장을 보내 주셔서 감사합니다. - (id) init {if ((self = [super init])) .... 괜찮습니까? – Curnelious

+0

나는 또한 당신이 말한 것과 똑같이 시도했으며 if 문 아래에 nslog를 출력했다. – Curnelious

관련 문제