8

通知が受信されない理由について、私は標準的な理由を知っています。

  • 登録されたオブジェクトの割り当てを解除または無効にします。
  • オブザーバーとしてオブジェクトを削除します。
  • オブザーバーとして登録していません。
  • 間違った通知に登録するか、間違った通知を投稿します。

私はこれらのどれも起こっていないことを確信していると喜んで言うことができます。最も可能性が高いのは、オブジェクトが無効化されて再作成されている可能性が高いと思いますが、初期化時に通知に登録されます。

ここに私が登録します:

/**
 *  initialises an object with a unique file url
 *
 *  @param  url                         the url to set as the file url
 */
- (id)initWithFileURL:(NSURL *)url
{
    if (self = [super initWithFileURL:url])
    {
        self.entries                    = [[NSMutableArray alloc] init];

        //  we want to be notified when a note has changed
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(noteChanged)
                                                     name:@"com.andbeyond.jamesvalaitis.notesChanged"
                                                   object:self];

        NSLog(@"Just registered for 'com.andbeyond.jamesvalaitis.notesChanged'");
    }

    return self;
}

これが私が通知を投稿する場所です:

/**
 *  save the note content
 */
- (void)saveNote
{
    if (_isChanged)
    {
        //  save to the text view to the note's contents
        self.note.noteContent           = self.noteView.text;

        //  post a notification that we changed the notes
        [[NSNotificationCenter defaultCenter] postNotificationName:@"com.andbeyond.jamesvalaitis.notesChanged" object:nil];

        NSLog(@"Just posted 'com.andbeyond.jamesvalaitis.notesChanged'");

        //  make sure we know it's already saved
        _isChanged                          = NO;
    }
}

これは呼び出されていないメソッドです:

/**
 *  called when a note has changed
 */
- (void)noteChanged:(NSNotification *)notification
{
    NSLog(@"Just received for 'com.andbeyond.jamesvalaitis.notesChanged'");

    //  save the notes
    [self saveToURL:self.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success)
    {
        if (success)
            NSLog(@"Note updated.");
    }];
}

これは、通知の登録と投稿の両方を行っていることを明確にするコンソールです。

2012-11-15 13:27:50.958 iCloudカスタム[11269:907]「com.andbeyond.jamesvalaitis.notesChanged」に登録されました

2012-11-15 13:28:24.184 iCloudカスタム[11269:907]投稿されたばかりの「com.andbeyond.jamesvalaitis.notesChanged」

プロジェクト全体はここにあります。

4

3 に答える 3

22

私は答えを理解したと思います。UIDocument。という名前のファイルに通知を作成していますNotesDocument.m。したがって、オブザーバーを作成するときは、オブジェクトを。として設定しますself。これは、NotesDocumentオブジェクトを意味します。しかし、あなたがするときpost the notification、あなたはオブジェクトをとして送信していますnil。したがってit wont observe the notification、ドキュメントに従って。これを克服する簡単な方法は、通知を作成するときのようにオブジェクトを設定する必要があることです。nilそれ以外の場合は、を渡す必要がありますNotesDocument Object

通知のaddObserverメソッドについては、以下の画像とパラメーターの詳細を確認してください。

ここに画像の説明を入力してください

パラメータを確認してnotificationSenderください。オブザーバーが通知を受け取りたいオブジェクト。つまり、この送信者によって送信された通知のみがオブザーバーに配信されます。

于 2012-11-15T14:16:11.300 に答える
0

以下を変更します。

...
selector:@selector(noteChanged:) 

...
- (void) noteChanged:(NSNotification *) notification
...
于 2012-11-15T13:45:33.313 に答える
-5

次のURLで問題が解決します。

http://mobile.tutsplus.com/tutorials/iphone/ios-sdk_nsnotificationcenter

于 2012-11-15T13:44:14.910 に答える