35

我试图让一个登录窗口显示为我的 MainWindow 中的工作表,但是每当我尝试实现 AppKit 方法时,由于各种难以区分的原因,总是会弹出一个错误。

那里的在线指南都不起作用,当我将他们的代码/改编类应用到我自己的项目时,它们永远不会起作用。

大多数指南都严重过时,包括 Apple 文档。而且它们似乎都不与自动引用计数兼容。或者 Xcode 4 接口。

有人可以为我详细介绍完整的指南,以便在主窗口上按下按钮后显示工作表的最简单方法。

如果您需要,请随时询问更多信息。

4

2 回答 2

94

Xcode 4 教程

创建新项目并将以下内容添加到AppDelegate.hAppDelegate.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

连接CloseApp Delegate.

Xcode

并选择endTheSheet

Xcode

连接OpenApp Delegate.

Xcode

并选择showTheSheet

Xcode

连接App Delegate到新的NSPanel.

Xcode

并选择theSheet

Xcode

选择NSPanel并禁用Visible At Launch(关键步骤!)

Xcode

现在点击运行并享受结果:

Xcode

于 2011-11-09T01:02:30.343 回答
6

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

这会导致上述调用中的 completionHandler 被触发, - 您可以通过调用 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
于 2015-04-28T18:27:21.787 回答