У меня есть два разных контроллера окна. Сначала это пользовательский контроллер окон панели, а другой - главный оконный контроллер. В окне панели есть окно панели, и на этой панели есть кнопка. На нажатие этих кнопок я отправляю уведомление как: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
. Ниже приводится заявление addObserver
selector
в 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
Я посылаю некоторые 'userInfo' при отправке уведомления.NSDictionary * dict = [Словарь NSDictionaryWithObjectsAndKeys: [NSNumber numberWithInteger: [тег отправителя]], @ "значение", ноль]; [[NSNotificationCenter defaultCenter] postNotificationName: @ "PanelButtonClickedNotification" object: self userInfo: dict]; Поэтому я не могу отправить 'window' в качестве объекта уведомления. – triandicAnt
Вы можете добавить его в dict, который вы создаете и разбираете. Конечно, только если он существует/класс знает окно. NSDictionary * dict = [NSDictionary dictionaryWithObjectsAndKeys: [номер NSNumberWithInteger: [sender tag]], @ "value", [self window], @ "window", nil]; [[уведомление userInfo] objectForKey: @ "window"] –
Не удается передать '[само окно]' при отправке уведомления, потому что его в отдельном оконном контроллере (в этом только окне панели существует, на котором есть кнопки и при нажатии этой кнопки отправляется уведомление). Главное окно находится в другом оконном контроллере, в котором я получаю уведомление ... Также, когда панель открывается в главном окне, и уведомление отправляется/принимается. После этого я не могу открыть NSBeginAlertSheet любым другим способом. ( – triandicAnt