2010-08-26 3 views
13

Ok, это действительно топал меня: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 присутствуют и находятся в нормальном состоянии.

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

ответ

19

Вам необходимо создать делегат для листа. Делегат должен реализовать метод с подписью вроде следующего:

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

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

Вы можете делать все, что вам нужно в конечном счете это должно быть завершено:

[sheet orderOut:self]; 

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

+0

Так оно и есть. Благодаря! – tomwhipple

+2

Вам фактически не нужен делегат (это необязательно). Единственное, чего не хватает, это вызов orderOut: – Nik

+1

У меня настроен делегат и селектор. Лист управляется оконным контроллером. Вызов endSheet: не действует (делегат НИКОГДА не уведомляется). Вызов stopModal работает, но это неправильно и вызывает проблемы при отображении дополнительных листов. WTF? Какао для рабочего стола действительно засасывает большое время. 90% времени, потраченного на эти идиосинкразии ... –

3

См: Creating a Modal Dialog or Window in Cocoa Objective-c?

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

[NSApp endSheet: loginWindow]; 
[loginWindow orderOut:self]; 
+0

Для чистой простоты это полезное решение. Работает с новой системой раскадровки для OSX. –

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