Отображение окна Cocoa в виде листа в Xcode 4 (OSX 10.7.2) с ARC
Я пытаюсь получить окно входа в систему, чтобы отображать его как лист из моего MainWindow, но всякий раз, когда я пытаюсь реализовать методы AppKit, ошибка всегда появляется по разным неразличимым причинам.
Ни один из онлайн-руководств не работает, когда я применяю свой код/адаптированные классы к своему собственному проекту, они никогда не работают.
Большинство руководств сильно устарели, включая документацию Apple. И ни один из них, похоже, не совместим с автоматическим подсчетом ссылок. Или интерфейсы Xcode 4.
Кто-нибудь сможет подробно описать для меня руководство, для простейшего способа отображения листа после нажатия кнопки на MainWindow.
Не стесняйтесь запрашивать дополнительную информацию, если вам это нужно.
Ответы
Ответ 1
Учебник для 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
.
Сделайте его видимым с помощью следующей кнопки:
![Xcode]()
Создайте новый NSPanel
.
Добавьте соответствующий NSButtons
.
![Xcode]()
Подключите Close
к App Delegate
.
![Xcode]()
И выберите endTheSheet
.
![Xcode]()
Подключите Open
к App Delegate
.
![Xcode]()
И выберите showTheSheet
.
![Xcode]()
Подключите App Delegate
к новому NSPanel
.
![Xcode]()
И выберите theSheet
.
![Xcode]()
Выберите NSPanel
и отключите Visible At Launch
.
(Существенный шаг!)
![Xcode]()
Теперь нажмите run и получите результат:
![Xcode]()
Ответ 2
В 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
Что вызывает завершение функции Hendler от вышеуказанного вызова, - в котором вы можете поместить вызов, чтобы остановить запуск модального окна, вызвав 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