Отображение окна какао в виде листа в Xcode 4 (OSX 10.7.2) с ARC - PullRequest
35 голосов
/ 09 ноября 2011

Я пытаюсь заставить Окно входа в систему отображаться как лист из моего MainWindow, но всякий раз, когда я пытаюсь реализовать методы AppKit, всегда появляется ошибка по разным неразличимым причинам.

Ни одно из онлайн-руководств не работает, когда я применяю их код / ​​адаптированные классы к моему собственному проекту, они никогда не работают.

Большинство руководств сильно устарели, включая документацию Apple. И ни один из них, похоже, не совместим с автоматическим подсчетом ссылок. Или интерфейсы Xcode 4.

Может ли кто-нибудь подробно описать для меня руководство по простейшему способу отображения листа после нажатия кнопки в главном окне.

Не стесняйтесь спрашивать дополнительную информацию, если она вам нужна.

Ответы [ 2 ]

93 голосов
/ 09 ноября 2011

Учебник для 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

6 голосов
/ 28 апреля 2015

В 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
...