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

以下网址将解决您的问题。

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

于 2012-11-15T13:44:14.910 回答