2013-06-25 6 views
0

У меня есть пользовательский класс для NSButton называется MyButton, где я отправляю уведомление на Quicksave MyButton.m:какао: saveAction называется 2 раза с уведомлением

-(void)mouseDown:(id)sender{ 
    [super mouseDown:sender]; 
    [super mouseUp:sender]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"quickSave" object:nil userInfo:nil]; 
} 

в AppDelegate я получаю уведомление для быстрого сохранения: AppDelegate.m:

- (IBAction)saveAction:(id)sender{ 
    NSLog(@"Saving..."); 
    NSError *error = nil; 
    if (![[self managedObjectContext] commitEditing]) { 
     NSLog(@"%@:%@ unable to commit editing before saving", [self class], NSStringFromSelector(_cmd)); 
    } 
    if (![[self managedObjectContext] save:&error]) { 
     [[NSApplication sharedApplication] presentError:error]; 
    } 
} 
-(void)awakeFromNib{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveAction:) name:@"quickSave" object:nil]; 
} 

Через NSLog "Saving..." я вижу, что saveAction называется 2 раза. Зачем?

P.S: уведомление требует 2 раза каждую функцию вставить в selector: поле, так что, возможно, это связано с -(void)awakeFromNib{...}, потому что я вижу, что он дважды называется (есть две разные самоуправления внутри awakeFromNib).

ОБНОВЛЕНИЕ: Я «решил» проблему привязки к интерфейсу Builder для приложения как делегата AppDelegate, а затем добавляет [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveAction:) name:@"quickSave" object:nil]; внутри -(void)applicationDidFinishLaunching:(NSNotification *)aNotification{...}. Я не знаю, является ли это реальным решением, и, очевидно, это не ответ на мой вопрос (почему awakeFromNib вызывается 2 раза), но это может быть полезно кому-то. У кого-нибудь есть ключ?

UPDATE2: право managedobjectcontext это одна называется в awakeFromNib во второй раз, первый (идентичен awakeFromNib и applicationDidFinishLaunching) является неправильным. Мое приложение - это приложение состояния, первый awakeFromNib вызывается, когда я запускаю приложение, а второй, когда открывается окно предпочтений.

+0

это бревно с отправителем и я: 'Сохранение ... отправителя: NSConcreteNotification 0x101915b70 {имя = Quicksave} самостоятельно: Saving ... отправитель: NSConcreteNotification 0x101915b70 {имя = Quicksave } self: ' есть два разных авто, я также пытался сделать' removeObserver' прямо перед 'addObserver', но это бесполезно. –

ответ

0

Сообщение журнала указывает, что два разных экземпляра AppDelegate получают одно уведомление. Возможно, вы дважды создали экземпляр AppDelegate. Убедитесь, что вы не вручную делаете [[AppDelegate alloc] init] или что-то в этом роде, и не помещаете несколько объектов AppDelegate в NIB.

+0

второй awakeFromNib вызывается, когда я открываю окно, однако я попытался удалить любую делегацию, но ничего не изменилось. В моих файлах нет импорта AppDelegate. –

+0

Если я прав, «первым я» является класс AppDelegate, а «второе я» - это «NSKVONotifying_AppDelegate». –

+0

ОК, в statusbarmenu xib был синий объект-объект appdelegate, но на нем было другое название метки, поэтому ужасная ошибка ... 2 xib, вызывающий тот же appdelegate –