2011-07-25 6 views
4

私はApp Inの購入をアプリに持っています。 In Appの購入はFirstViewControllerで管理されます。ユーザーが製品を購入したとき、MainTableViewControllerに通知を送信してテーブルデータを再読み込みし、In App購入で購入した新しいオブジェクトを表示したいと思います。だから基本的に私はクラスAからクラスBへの通知を送信し、クラスBはテーブルビューのデータをリロードします。私はNSNotificationCenterを使用しようとしましたが、成功しませんでしたが、NSNotificationCenterで可能なことは分かりません。クラスAでクラスAからクラスBにNSNotificationを送信

答えて

24

:クラスBに通知

[[NSNotificationCenter defaultCenter] postNotificationName:@"DataUpdated" 
                 object:self]; 

を投稿:通知するための第1のレジスタ、及びそれを処理するための方法を記述する。
対応するセレクタにメソッドを渡します。

// view did load 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(handleUpdatedData:) 
              name:@"DataUpdated" 
              object:nil]; 

-(void)handleUpdatedData:(NSNotification *)notification { 
    NSLog(@"recieved"); 
    [self.tableView reloadData]; 
} 
+0

は:( – JonasG

+1

それが必要と動作しません。あなたは、クラスAは、いくつかのデータを更新した場合、これらの変更はClassBの中に反映されていることを確認してください。通知を実行するために、より多くを必要としません。あなたもClassBのAを与えることの通知を使用することができます値が返されますが、 'reloadData'はtableViewにデータソースのデータを再度要求します。 –

+0

通知が送信されたときに{ - self} {{self.tableView reload data};}が呼び出されません。コードを修正しようとしましたが、それは助けにはなりませんでした。 – JonasG

0

別のスレッドから通知を送信しようとしていますか? NSNotificationは別のスレッドからオブザーバに渡されません。

+0

別のスレッドから送信されたかどうかはどのように分かりますか? – JonasG

+0

通知を生成する場所の[NSThread currentThread]と、通知対象のクラスの[NSThread mainThread]を比較してみてください。 –

+1

また、オブザーバーを追加するときは、指定していないもの**オブジェクト**を確認してください。 –

8

私はクラスAでビンスの答え

に少しより多くの情報を追加しているOK:クラスBに通知

[[NSNotificationCenter defaultCenter] postNotificationName:@"DataUpdated" 
                object:arrayOfPurchasedObjects]; 

を投稿:通知のために最初に登録して、へのメソッドを書きます扱う。
対応するセレクタにメソッドを渡します。通知を送信する前にクラスBが割り当てられていることを確認してください。それ以外の通知は機能しません。

- (void) viewDidLoad { 
// view did load 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(handleUpdatedData:) 
              name:@"DataUpdated" 
              object:nil]; 
} 

-(void)handleUpdatedData:(NSNotification *)notification { 
    NSLog(@"recieved"); 
    NSArray *purchased = [notification object]; 
    [classBTableDataSourceArray addObjectsFromArray:purchased]; 
    [self.tableView reloadData]; 
} 

- (void) dealloc { 
    // view did load 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
               name:@"DataUpdated" 
               object:nil]; 
    [super dealloc]; 
} 
+0

thxでも動作しません。また、NSUserdefaultsを使用してアプリの購入が完了したかどうかを認識するので、配列にオブジェクトを追加する必要はありません。新しい人(私)のために – JonasG

+0

、上記の答えにタイプミスがあり、 'postNotficationName'がエラーを投げ、 'postNotificationName'(別の 'i')がそれを修正します。 (通知処理の明確化に役立ててくれたRahul Vyasに感謝します)。 – tmr

+0

@RahulVyasの答えにタイプミスがあります。 "postNotficationName"ではありません。 "postNotificationName" –

関連する問題