Отображение окна какао в виде листа в Xcode 4 (OSX 10.7.2) с ARC
Я пытаюсь заставить Окно входа в систему отображаться как лист из моего MainWindow, но всякий раз, когда я пытаюсь реализовать методы AppKit, всегда появляется ошибка по различным неразличимым причинам.
Ни одно из онлайн-руководств там не работает, когда я применяю их код / адаптированные классы к своему собственному проекту, они никогда не работают.
Большинство руководств сильно устарели, включая документацию Apple. И ни один из них, похоже, не совместим с автоматическим подсчетом ссылок. Или интерфейсы Xcode 4.
Кто-нибудь сможет подробно описать для меня руководство по простейшему способу отображения листа после нажатия кнопки в главном окне.
Не стесняйтесь спрашивать дополнительную информацию, если вам это нужно.
2 ответа
Учебник для Xcode 4
Создайте новый проект и добавьте следующее в AppDelegate.h
а также AppDelegate.m
,
AppDelegate.h
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate> {
IBOutlet NSPanel *theSheet;
}
@property (assign) IBOutlet NSWindow *window;
@end
AppDelegate.m
#import "AppDelegate.h"
@implementation AppDelegate
@synthesize window = _window;
- (IBAction) showTheSheet:(id)sender {
[NSApp beginSheet:theSheet
modalForWindow:(NSWindow *)_window
modalDelegate:self
didEndSelector:nil
contextInfo:nil];
}
-(IBAction)endTheSheet:(id)sender {
[NSApp endSheet:theSheet];
[theSheet orderOut:sender];
}
@end
Открой MainMenu.xib
,
Используйте существующие NSWindow
,
Сделайте это видимым, используя следующую кнопку:
Создать новый NSPanel
,
Добавьте соответствующий NSButtons
,
соединять Close
к App Delegate
,
И выберите endTheSheet
,
соединять Open
к App Delegate
,
И выберите showTheSheet
,
Подключите App Delegate
к новому NSPanel
,
И выберите theSheet
,
Выберите NSPanel
и отключить Visible At Launch
,(Существенный шаг!)
Теперь нажмите Run и наслаждайтесь результатом:
В SDK 10.10 все изменилось - я думаю, что звонки проще для понимания. Родительское окно отвечает за запуск дочернего NSWindow в виде листа, а затем вы передаете этот дочерний NSWindow в NSApp для запуска модально. Затем сделайте обратное, чтобы развернуть.
Отображение листа
Чтобы отобразить лист вместо вызова:
[NSApp beginSheet:theSheet
modalForWindow:(NSWindow *)_window
modalDelegate:self
didEndSelector:nil
contextInfo:nil];
Теперь вы вызываете родительское окно:
(void)beginSheet:(NSWindow *)sheetWindow
completionHandler:(void (^)(NSModalResponse returnCode))handler
А затем, чтобы запустить лист как в модальном цикле, вы также должны вызвать NSApp с помощью:
- (NSInteger)runModalForWindow:(NSWindow *)aWindow
Закрытие листа
Чтобы закрыть лист, вызовите родительское окно:
- (void)endSheet:(NSWindow *)sheetWindow
Что вызывает завершение завершения от вышеупомянутого вызова, - в котором вы можете поместить вызов, чтобы остановить запуск модального окна, вызвав NSApp с:
- (void)stopModalWithCode:(NSInteger)returnCode
Полный пример
@implementation AppDelegate
@synthesize window = _window;
- (IBAction) showTheSheet:(id)sender {
[_window beginSheet: theSheet
completionHandler:^(NSModalResponse returnCode) {
[NSApp stopModalWithCode: returnCode];
}];
[NSApp runModalForWindow: theSheet];
}
-(IBAction)endTheSheet:(id)sender {
[_window endSheet: theSheet];
}
@end