Какао: NSApp beginSheet устанавливает делегат приложения? - PullRequest
2 голосов
/ 17 марта 2010

Я пытаюсь отобразить пользовательский лист в своем приложении, но я думаю, что я делаю что-то не так. Хотя все кажется работает нормально, у меня есть довольно странный побочный эффект. (что потребовалось несколько часов, чтобы выяснить). Оказывается, что каждый раз, когда я отображаю лист в своем приложении, делегату Application присваивается экземпляр листа, поэтому мой Контроллер получает unset в качестве делегата, вызывающего все виды проблем.

Я создал файл NIB, который я назвал FailureSheet.xib. Я выложил свой интерфейс в IB, а затем создал подкласс NSWindowController с именем FailureSheet.m, который я установил для владельца файла. Вот мой класс FailureSheet:

#import "FailureSheet.h"

@implementation FailureSheet  // extends NSWindowController

- (id)init
{
    if (self = [super initWithWindowNibName:@"FailureSheet" owner:self])
    {

    }
    return self;
}

- (void)dealloc
{
    [super dealloc];
}

- (IBAction)closeSheetTryAgain:(id)sender
{   
    [NSApp endSheet:[self window] returnCode:1];
    [[self window] orderOut:nil];
}

- (IBAction)closeSheetCancel:(id)sender
{
    [NSApp endSheet:[self window] returnCode:0];
    [[self window] orderOut:nil];
}

- (IBAction)closeSheetCancelAll:(id)sender
{
    [NSApp endSheet:[self window] returnCode:-1];
    [[self window] orderOut:nil];
}

@end

Ничего сложного здесь не происходит. Теперь вот как я отображаю FailureSheet в своем классе 'Controller':

sheet = [[FailureSheet alloc] init];

[NSApp beginSheet:[sheet window]
   modalForWindow:window
    modalDelegate:self
   didEndSelector:@selector(failureSheetDidEnd:etc:etc:)
      contextInfo:nil];

Теперь, если я запишу, что [делегат NSApp] перед отображением моего листа, это , что правильно. Затем, после запуска этого кода и моего листа, если я регистрирую его снова, это .

Не уверен, что я здесь делаю неправильно - есть идеи?

1 Ответ

5 голосов
/ 17 марта 2010

Это один из тех ответов "Я-идиот".

Оказывается, я в какой-то момент случайно установил соединение в файле NIB моего листа между Приложением и Владельцем файла (FailureSheet), установив его в качестве делегата. Таким образом, каждый раз, когда он загружался, он перезаписывал существующее подключение делегата, которое было в моем файле MainMenu NIB.

...