1

我为 Mac OS X 创建了一个只有状态栏的应用程序。类似http://d.pr/i/Covi的东西。我通过本教程http://cocoatutorial.grapewave.com/2010/01/creating-a-status-bar-application/创建了它。现在我有一个问题:如何通过单击“关于”菜单项来显示窗口?我尝试这样做:

#import "IGAppDelegate.h"
#import "IGAboutWindowController.h"

@implementation IGAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
}

- (void)awakeFromNib {
    _statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
    [_statusItem setMenu:_menu];
    [_statusItem setTitle:@"LeoHelper"];
    [_statusItem setHighlightMode:YES];
}

#pragma mark - Actions



- (IBAction)quit:(id)sender {
    [NSApp terminate:self];
}

- (IBAction)about:(id)sender {
    IGAboutWindowController *aboutController = [[IGAboutWindowController alloc] init];
    [aboutController showWindow:self];
}
@end
4

1 回答 1

2

我将猜测您正在使用自动引用计数(ARC)。如果你是,那么这就是方法中将发生的事情about:

你首先创建一个本地实例IGAboutWindowController,然后告诉它显示它的窗口。这将在屏幕上显示窗口,但是,如果您的项目使用 ARC,则该窗口将立即消失。这样做的原因是,一旦about:方法结束,您的本地实例IGAboutWindowController将被自动释放,结果,它的窗口将从屏幕上删除。

about:要在 ARC 管理的项目中成功实现此方法,您应该将 定义aboutController为类的实例变量,IGAppDelegate如下所示:

@class IGAboutWindowController;

@interface IGAppDelegate : NSObject <...>

@property (nonatomic, strong) IGAboutWindowController *aboutController;

@end

然后about:像这样实现你的方法:

- (IBAction)about:(id)sender {
    if (self.aboutController == nil)
       self.aboutController = [[IGAboutWindowController alloc] init];
    [aboutController showWindow:self];
}
于 2013-01-17T22:51:36.727 回答