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

Jam*_*amy 35 cocoa xcode4.2 automatic-ref-counting osx-lion cocoa-sheet

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

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

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

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

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

Ann*_*nne 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

打开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中

  • 你正在翻转惊人的!这些截图非常好,很有帮助,非常感谢你. (8认同)
  • 你的屏幕截图让我想起了绝地大师的作品.谢谢 :) (2认同)

jam*_*rez 6

SDK 10.10中的内容已经发生了变化 - 我认为调用更容易理解.父窗口负责将子NSWindow作为工作表启动 - 然后将此子NSWindow传递给NSApp以进行模态运行.然后做相反的解开.

显示表格

要显示工作表而不是调用:

[NSApp beginSheet:theSheet
   modalForWindow:(NSWindow *)_window
    modalDelegate:self
   didEndSelector:nil
      contextInfo:nil];
Run Code Online (Sandbox Code Playgroud)

您现在调用父窗口:

(void)beginSheet:(NSWindow *)sheetWindow
 completionHandler:(void (^)(NSModalResponse returnCode))handler
Run Code Online (Sandbox Code Playgroud)

然后在模态循环中运行工作表,您还必须使用以下命令调用NSApp:

- (NSInteger)runModalForWindow:(NSWindow *)aWindow
Run Code Online (Sandbox Code Playgroud)

关闭表

要关闭工作表,请在父窗口上调用:

- (void)endSheet:(NSWindow *)sheetWindow
Run Code Online (Sandbox Code Playgroud)

这导致上述调用中的completionHandler触发, - 您可以通过调用NSApp来调用停止运行模式窗口:

- (void)stopModalWithCode:(NSInteger)returnCode
Run Code Online (Sandbox Code Playgroud)

完整的例子

@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
Run Code Online (Sandbox Code Playgroud)

  • 需要说明的是,在调用beginSheet之前必须隐藏工作表窗口,否则它看起来像是工作表但没有附加. (2认同)