2015-02-24 1 views
0

У меня есть два разных контроллера окна. Сначала это пользовательский контроллер окон панели, а другой - главный оконный контроллер. В окне панели есть окно панели, и на этой панели есть кнопка. На нажатие этих кнопок я отправляю уведомление как:NSNotification addObserver селектор не смог открыть лист NSBeginAlertSheet в окне

In PanelWindowController: 
    -(IBAction)okAndCancelButtonClicked:(id)sender 
    { 
     [self postNotification:sender]; 
    } 

    -(void)postNotification:(id)sender 
    { 
     if([sender tag]!=2){ 
      [[self window] endSheet:self.panel returnCode:NSModalResponseCancel]; 
      [self.panel orderOut:self]; 
     } 
     NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInteger:[sender tag]],@"value",nil]; 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"PanelButtonClickedNotification" object:self userInfo:dict]; 
    } 

Теперь в моем главном контроллере окна, я пытаюсь открыть NSBeginAlertSheet в selector из addObserver из NSNotificationCenter. Ниже приводится заявление addObserverselector в init методе моего главного контроллера окна:

MainWindowController 

-(id) init{ 
..// some code here 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(okButtonClicked:) name:@"PanelButtonClickedNotification" object:[self panelClass]]; 
return self; 
} 

реализация okButtonClicked заключается в следующем:

- (void) okButtonClicked:(NSNotification*)notification 
{ 
    if ([[notification object] isEqualTo:[self panelClass]]) 
    { 
     if([[[notification userInfo] objectForKey:@"value"] integerValue] == 1) 
     { 
      // Yes Button in the Panel is clicked 
     } 
     else if([[[notification userInfo] objectForKey:@"value"] integerValue] == 0) 
     { 
      // No Button in the Panel is clicked 
      NSBeginAlertSheet(@"Alert", @"Ok", nil, nil, [[self view] window], self,nil, nil,nil,@"Alert is being shown on window."); 
     } 

    } 
} 

Когда пользователь нажимает кнопку Нет, на панели, предупреждение в окне должен отображаться. Но предупреждение никогда не отображается. Я также пробовал [NSApp keyWindow] и [NSApp mainWindow] вместо [[self view] window]. И, если я бегу предупреждение независимо от окна, он отображается:

NSAlert *alert = [[NSAlert alloc] init]; 
[alert setMessageText:@"Alert"]; 
[alert addButtonWithTitle:@"OK"]; 
NSImage *icon=[NSImage imageNamed:@"warning.png"]; 
[alert setIcon:icon]; 
[alert runModal]; 

Пожалуйста, дайте мне знать, если я ничего здесь отсутствует.

Предупреждение не отображается ни в одном из методов, вызванных после получения уведомления. PFA мой образец проекта: https://www.dropbox.com/s/0xfe4bk17v9girj/PanelApplication.zip?dl=0

ответ

0

Проблема была не с уведомлениями, это была группа, которая была причиной проблемы: я открывал панель в моем главном контроллере окна:

[[self window] beginSheet:self.panelClass.panel completionHandler:nil];

И закрывающая действие панели было записанных в окне контроллера окна. По этой причине no NSBeginAlertSheet не показывался после того, как пользовательская панель была загружена/выгружена в главном окне.

Поэтому перемещение следующего фрагмента кода из окна панели управления к главному контроллеру окна решить эту проблему:

[[self window] endSheet:self.panelClass.panel returnCode:NSModalResponseCancel]; [self.panelClass.panel orderOut:self];

0

Это немного трудно сказать, но моя догадка бы, что объект, который реагирует на уведомление, в okButtonClicked: функции, не имеет (действующий) ссылка на ваше окно. И тогда предупреждение не знает, в каком окне отображать.

Если вы можете отправить ссылку на свое окно в объекте уведомления, вы должны будете получить предупреждение, отображаемое в нужном окне.

пример кода:

[[NSNotificationCenter defaultCenter] postNotificationName:@"PanelButtonClickedNotification" object:[self window]]; 

И:

- (void) okButtonClicked:(NSNotification*)notification 
{ 
    NSBeginAlertSheet(@"Alert", @"Ok", nil, nil, [notification object], self,nil, nil,nil,@"Alert is being shown on window."); 
} 

это работает в моем тестовом проекте.

+0

Я посылаю некоторые 'userInfo' при отправке уведомления.NSDictionary * dict = [Словарь NSDictionaryWithObjectsAndKeys: [NSNumber numberWithInteger: [тег отправителя]], @ "значение", ноль]; [[NSNotificationCenter defaultCenter] postNotificationName: @ "PanelButtonClickedNotification" object: self userInfo: dict]; Поэтому я не могу отправить 'window' в качестве объекта уведомления. – triandicAnt

+0

Вы можете добавить его в dict, который вы создаете и разбираете. Конечно, только если он существует/класс знает окно. NSDictionary * dict = [NSDictionary dictionaryWithObjectsAndKeys: [номер NSNumberWithInteger: [sender tag]], @ "value", [self window], @ "window", nil]; [[уведомление userInfo] objectForKey: @ "window"] –

+0

Не удается передать '[само окно]' при отправке уведомления, потому что его в отдельном оконном контроллере (в этом только окне панели существует, на котором есть кнопки и при нажатии этой кнопки отправляется уведомление). Главное окно находится в другом оконном контроллере, в котором я получаю уведомление ... Также, когда панель открывается в главном окне, и уведомление отправляется/принимается. После этого я не могу открыть NSBeginAlertSheet любым другим способом. ( – triandicAnt

Смежные вопросы