如何使用按钮在cocoa mac应用程序中打开一个新窗口

时间:2013-10-01 20:38:01

标签: objective-c macos cocoa

我必须做一个简单的应用程序,当按下按钮时,应该会出现一个新窗口。 我试过

- (IBAction)LanciaPavia:(id)sender {
    NSWindowController *controllerWindow = [[NSWindowController alloc] initWithWindowNibName:@"AOPAVIAWindowController"];
    [controllerWindow showWindow:self];
}

但会出现新窗口并立即关闭。我需要做什么?我不知道要继续,我是可可世界的新手!

4 个答案:

答案 0 :(得分:3)

答案的关键是范围:

- (IBAction)LanciaPavia:(id)sender {
    NSWindowController *controllerWindow = [[NSWindowController alloc] initWithWindowNibName:@"AOPAVIAWindowController"];
    [controllerWindow showWindow:self];
}    // controllerWindow goes out of scope

在该范围的末尾,controllerWindow将超出范围(我假设您正在使用ARC),因此窗口控制器将被销毁并关闭窗口。

将其设为实例变量,最好只创建一次。

答案 1 :(得分:1)

尝试在controllerWindow

之前调用self 像这样:

[self.controllerWindow showWindow:self];

答案 2 :(得分:1)

加载窗口的简单方法如下: -

#import <Cocoa/Cocoa.h>
#import "AOPAVIAWindowController.h"
@interface ARCAppDelegate : NSObject <NSApplicationDelegate>
{
    NSWindowController *windowController;
}
-(IBAction)loadWindowNew:(id)sender;
@property(readwrite,strong)NSWindowController *windowController;
@end

#import "ARCAppDelegate.h"

    @implementation ARCAppDelegate
    @synthesize arcWindowController;
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    {
        // Insert code here to initialize your application
    }
    -(IBAction)loadWindowNew:(id)sender
    {
        self.windowController=[[AOPAVIAWindowController alloc]init];
        [self.windowController showWindow:self];
    }
    @end

现在在你的窗口中,控制器类写成如下: -

#import "AOPAVIAWindowController.h"
@implementation AOPAVIAWindowController
-(NSString *)windowNibName
{
    return @"AOPAVIAWindowController";
}
@end

答案 3 :(得分:0)

您的controllerWindow变量是LaciaPavia:方法的本地变量,因此只要方法完成执行,它就会被释放。尝试在包含LaciaPavia:的类中创建属性。然后执行以下操作:

- (IBAction)LaciaPavia:(id)sender {
    if (!_controllerWindow) {
        _controllerWindow = [[NSWindowController alloc] initWithWindowNibName:@"AOPAVIAWindowController"];
    }
    [[self controllerWindow] showWindow:self];
}