1

私は自分のアプリにUITableview Controller、View Controllerを持っていて、NSNotificationCenterを使ってUITableview ControllerからViewControllerにNSDictionaryを渡そうとしています。したがって、UITableview Controller で通知をプッシュしてから、ViewController でセレクターを使用してオブザーバーを追加します。セレクターが呼び出されますが、NSLog があり、次のようなメモリ結果を取得します。

ビューコントローラー: 0x8a0bcc0

NSDictionary の代わりに NSString を渡そうとしましたが、文字列の値ではなく、メモリ結果を再度取得します。

私のコード:

UITableView コントローラー

    NSString *string=@"This is a test string";
    [[NSNotificationCenter defaultCenter] postNotificationName: @"Update" object: string];

ViewController

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

そして、incomingNotification セレクター メソッドは次のとおりです。

-(void) incomingNotification : (NSNotification *)notification{
    NSLog(@"Trying to print : %@",[notification object]);
}

すべての通知は ViewDidLoad メソッドで行われます。ありがとうございます!

アップデート

最後に、NSNotificationCenter の使用をやめ、プロパティを使用してデータを渡し、TableViewController からの継承を少し変更しました。通知が想定どおりに機能しなかった理由がわかりません。皆さん、ご提案やアイデアをどうもありがとうございました :)

4

2 に答える 2

1
[[NSNotificationCenter defaultCenter] postNotificationName:@"Update" object:self]

オブジェクトとは、通知を生成するオブジェクトを意味します。パラメータを投稿するには、別の方法を使用します

[[NSNotificationCenter defaultCenter] postNotificationName:@"Update" object:self userInfo:string]
于 2013-10-17T22:02:17.933 に答える
0

私の理解が正しければUIViewController、 のボタンをタップすると が表示されUITableViewControllerます。ViewControllerオブザーバーとしてを に追加している場合-viewDidLoad:は、ロードされたときにのみ通知を受け取ることができます。

あなたは何が必要ですか:

1) このようなオーバーライド-initまたは-initWithNibName:メソッドViewController:

-(id) init
{
    self = [super init];
    if (self)
    {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(incomingNotification:) name:@"Update" object:nil];
    }
    return self;
}

そのため、最初から通知を監視していることを確認できますViewController(まあ、これはあなたのケースでは不要なステップかもしれません)

2) プッシュするときは、次ViewControllerのように、作成後に通知を送信する必要があります。

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    ViewController *nextController = [[ViewController alloc] initWithNibName:nil bundle:nil];
    [self.navigationController pushViewController:nextController animated:YES];

    NSString *string=@"This is a test string";
    [[NSNotificationCenter defaultCenter] postNotificationName: @"Update" object: string];
}

ただし、あるView Controllerから別のView Controllerにパラメータを送信するだけの場合、これは間違った方法です。このプロパティを設定ViewControllerするメソッド-tableView:didSelectRowAtIndex:でプロパティを作成するだけですUITableViewController

于 2013-10-17T22:45:48.617 に答える