0

ローカル通知を送信しようとしています。通知を送信するクラスのコードは次のとおりです。

@interface Sender : UIView
{
    NSInteger itemID;
} 

@implementation Sender

-(void) changedProperty
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"NotificationName" object:NULL];
}

この通知を受け取るコードは次のとおりです。

@interface Listener : UIViewController
{

}

@implementation Listener
- (void)viewDidLoad
{
    [super viewDidLoad];        

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(selectedItem:) name:@"NotificationName" object:NULL];
}

- (void)viewDidUnload
{
    [super viewDidUnload];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"NotificationName" object:NULL];
}

-(void) selectedItem:(NSNotification *) notification
{
    // some actions
}

しかし、このコードは機能しません。デバッグpostNotificationName: オブジェクトがどのように機能するかはわかりますが、 selectedItem:メソッドは呼び出されません

アップデート。 これがより多くのコードです。多分これが役立つでしょう。

extern const NSString* selectItemNotificationName;    
@interface vRoomSelectorItem : UIView
{
    RoomSelectorItemBackground backgroundType; 
    NSInteger itemID;
}
@property NSInteger itemID;
-(void) setBackgroundType:(RoomSelectorItemBackground) backgroundType;

@interface vRoomSelectorItem ()
@property RoomSelectorItemBackground backgroundType;
@end

@implementation vRoomSelectorItem

const NSString* selectItemNotificationName = @"Reservation.SelectRoom";

-(RoomSelectorItemBackground) backgroundType
{
    return backgroundType;
}
-(void) setBackgroundType:(RoomSelectorItemBackground)value
{
    if(backgroundType != value)
    {
        backgroundType = value;
        [self changedBackgroundType];
    }
}
-(void) changedBackgroundType
{
    if(backgroundType == RoomSelectorItemFilled)
    {
        // animation
        dispatch_async(dispatch_get_main_queue(), ^{
            [[NSNotificationCenter defaultCenter] postNotificationName:(NSString*)selectItemNotificationName object:NULL userInfo:[[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInteger:itemID], @"ID", NULL]];
        });
    }
    else
        // reverse animation  
}

#import "vRoomSelectorItem.h"
    @interface vcReservationSelectRoom : UIViewController
{
    NSMutableArray* arraySelectorItems;
}        

@implementation vcReservationSelectRoom

- (void)viewDidLoad
{
    [super viewDidLoad];    

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(selectedItem:) name:(NSString*)selectItemNotificationName object:NULL];        

    for(NSInteger i = 1; i <= SELECTOR_ITEM_COUNT; ++i)
    {
        vRoomSelectorItem* newItem = [[vRoomSelectorItem alloc] initWithFrame:CGRectMake(/*coordinates*/)];
        [self.view addSubview:newItem];            
        [newItem setBackgroundType:RoomSelectorItemTransparent];
        [newItem setItemID:i];
        [arraySelectorItems addObject:newItem];
        newItem = NULL;
    }
}

-(void) selectedItem:(NSNotification *) notification
{
    // some actions
}

-(void) dealloc
{    
    arraySelectorItems = NULL;
    [[NSNotificationCenter defaultCenter] removeObserver:self name:(NSString*)selectItemNotificationName object:NULL];
}
@end
4

3 に答える 3

0

わかりました、私は問題を解決しました。上記のコードは、なぜ機能しないのかを理解するのに十分ではありません。クラスvcReservationSelectRoomのオブジェクトは一時的なものであり、 vRoomSelectorItemから通知を送信する前に破棄されていました。この問題を解決するのに十分なコードを表示していないという私の間違いで申し訳ありません。そして、助けてくれてありがとう。

于 2012-08-07T11:26:36.987 に答える
0

コードが機能するようです。通知がメイン スレッドにあり、ワークフローが次のようになっていることを確認します。

  1. リスナーを通知センターに追加する
  2. 送信者の開始
  3. 通知を送信

次のようにして、メインスレッドにあることを確認できます。

dispatch_async(dispatch_get_main_queue(), ^{
    [[NSNotificationCenter defaultCenter] post...];
});

私が変更するいくつかのこと:

  • NSNotificationCenter-(void)dealloc代わりにから自分を削除します-(void)viewDidUnload。viewDidUnload は非推奨になり、dealloc は viewDidUnload なしで呼び出される可能性があります。

  • 通知の場合、文字列をタイプミスしないように、名前を外部定数に保存するのが好きです。

    //header.h
    extern NSString *const notificationName;
    
    
    //implementation.m
    NSString *const notificationName = @"notification";
    
于 2012-08-06T11:16:19.707 に答える