使用ARC在Xcode 4(OSX 10.7.2)中将Cocoa窗口显示为工作表

时间:2011-11-08 23:49:03

标签: cocoa osx-lion xcode4.2 automatic-ref-counting cocoa-sheet

我正在尝试将一个登录窗口显示为来自我的MainWindow的工作表,但每当我尝试实现AppKit方法时,总会出现错误,因为各种无法区分的原因。

没有在线指南有效,当我将他们的代码/改编课程应用到我自己的项目时,他们从不工作。

大多数指南都过时了,包括Apple文档。而且它们似乎都与自动参考计数兼容。或Xcode 4接口。

有人能够在完整的指南中为我详细说明,以便在MainWindow按下按钮后显示表单的最简单方法。

如果您需要,请随时提出更多信息。

2 个答案:

答案 0 :(得分:93)

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

答案 1 :(得分: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