NSApplication endSheet: не влияет

Хорошо, это действительно ставит меня в тупик:

Я создаю модальный лист в окне как

-(IBAction) login: (id) sender {
[NSApp beginSheet:loginWindow 
   modalForWindow:window 
    modalDelegate:nil 
   didEndSelector:nil 
      contextInfo:nil];
}

и попробуй удалить его с

-(IBAction) loginWindowCancelPressed:   (id) sender {
debugLog(@"cancel");
[NSApp endSheet:loginWindow];
}

но остается.

Я проверил все очевидные вещи, такие как соединения с IB и убедился, что окна и loginWindow присутствуют и находятся в нормальном состоянии.

Итак, вопрос: я что-то упустил?


person tomwhipple    schedule 26.08.2010    source источник


Ответы (2)


Вы должны настроить делегата для листа. Делегат должен реализовать метод с такой сигнатурой:

- (void)didEndSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;

(Вы можете использовать другое имя, если хотите, но оно должно принимать те же параметры.)

Вы можете делать все, что вам нужно в этом методе, но в конечном итоге он должен заканчиваться:

[sheet orderOut:self];

который отклонит лист.

person mipadi    schedule 26.08.2010
comment
На самом деле вам не нужен делегат (это необязательно). Не хватает только вызова orderOut: - person Nik; 08.01.2012
comment
У меня есть делегат и селектор. Лист управляется оконным контроллером. Вызов endSheet: не имеет никакого эффекта (делегат НИКОГДА не уведомляется). Вызов stopModal работает, но он неверен и вызывает проблемы при отображении следующих листов. ВТФ? Какао для рабочего стола действительно отстой. 90% времени уходит на то, чтобы разобраться с этими идиосинкразиями... - person Nicolas Miari; 16.04.2012
comment
вызов orderOut для экземпляра NSWindow закрывает окно, а не лист. - person auco; 27.06.2013
comment
@auco: лист является экземпляром NSWindow. - person mipadi; 27.06.2013

См.: Создание модального диалогового окна или окна в Cocoa Objective- в?

Делегат не требуется. Следующее работает для меня, чтобы отклонить и позволяет перезвонить позже:

[NSApp endSheet: loginWindow];
[loginWindow orderOut:self];
person Noah    schedule 01.08.2014
comment
Для чистой простоты это полезное решение. Также работает с новой системой раскадровки для OSX. - person Maury Markowitz; 04.04.2016