2010-11-05 4 views
4

У меня есть xib-файл с только NSPanel в нем, я пытаюсь показать эту панель как модальный лист (с beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:). Владелец файла для этого xib - это класс контроллера MyController, который имеет IBOutlet для NSPanel.Как загрузиться с xib? (MacOSx)

То, что я ищу что-то вроде:

... 
MyController *controller = [[MyController alloc] init]; 

[NSApp beginSheet:controller.panel modalForWindow:[NSApp mainWindow] modalDelegate:controller didEndSelector:nil contextInfo:nil]; 
... 

Вопрос: должны MyController наследовать от NSWindowController или NSObject?. Я попробовал NSWindowController и initWithWindowNibName:, но выход до NSPanel всегда равен нулю.

Thanks

+1

NSWindowController будет лениво загрузить файл XIB, когда его сбруя «окно» называется. Если вы подклассифицируете оконный контроллер, попробуйте удалить панель и воспользуйтесь встроенной оконной розеткой. Затем, когда вы вызываете аксессуар для представления листа, будет загружен XIB. Обработка памяти объектов верхнего уровня из [NSBundle loadNibNamed: @ "XibName" owner: self] сложна. NSWindowController обрабатывает все это для вас. Я бы рекомендовал использовать его. Кроме того, свойство инспектора, которое вы хотите отключить, или окно «Visible At Launch». –

+0

Как NSWindowCntroller знает, что xib загружать при доступе к свойству «окна»? –

+0

при инициализации NSWindowController вы указываете имя или путь к nib. Вот как он знает, что пить для загрузки. – JWWalker

ответ

8

Я разрешаю это. Вы должны деактивировать почти все свойства объекта окна (в IB), которые вы используете для листа. Добавить следующий метод в мой контроллер, чтобы показать лист:

- (void)showInWindow:(NSWindow *)mainWindow { 
    if (!panelSheet) 
     [NSBundle loadNibNamed:@"XibName" owner:self]; 

    [NSApp beginSheet:panelSheet modalForWindow:mainWindow modalDelegate:nil didEndSelector:nil contextInfo:nil]; 
    [NSApp runModalForWindow:panelSheet]; //This call blocks the execution until [NSApp stopModal] is called 
    [NSApp endSheet:panelSheet]; 
    [panelSheet orderOut:self]; 
} 

panelSheet является IBOutlet к окну листа.

Спасибо Jon Hess и JWWalker за помощь

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