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

Objective c 如何使用按钮在cocoa mac应用程序中打开新窗口,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我必须做一个简单的应用程序,当按下一个按钮,一个新的窗口应该出现。 我试过了 - (IBAction)LanciaPavia:(id)sender { NSWindowController *controllerWindow = [[NSWindowController alloc] initWithWindowNibName:@"AOPAVIAWindowController"]; [controllerWindow showWindow:self]; } 但新窗口出现并立即

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

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

但新窗口出现并立即关闭。我该怎么办?我不知道该怎么做,而且我对可可世界还是个新手

尝试在控制器窗口之前调用self

像这样:

[self.controllerWindow showWindow:self];

试着在控制器窗口之前给自己打电话

像这样:

[self.controllerWindow showWindow:self];

您的
controllerWindow
变量是
LaciaPavia:
方法的一个局部变量,因此一旦该方法完成执行,它就会被解除分配。尝试在包含
LaciaPavia:
的类中创建属性。然后执行以下操作:

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

您的
controllerWindow
变量是
LaciaPavia:
方法的一个局部变量,因此一旦该方法完成执行,它就会被解除分配。尝试在包含
LaciaPavia:
的类中创建属性。然后执行以下操作:

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

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

#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 <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

答案的关键在于范围:

- (IBAction)LanciaPavia:(id)sender {
    NSWindowController *controllerWindow = [[NSWindowController alloc] initWithWindowNibName:@"AOPAVIAWindowController"];
    [controllerWindow showWindow:self];
}    // controllerWindow goes out of scope
在该范围结束时,
controllerWindow
将超出范围(我假设您使用的是ARC),因此窗口控制器将被销毁,窗口将关闭


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

答案的关键是范围:

- (IBAction)LanciaPavia:(id)sender {
    NSWindowController *controllerWindow = [[NSWindowController alloc] initWithWindowNibName:@"AOPAVIAWindowController"];
    [controllerWindow showWindow:self];
}    // controllerWindow goes out of scope
在该范围结束时,
controllerWindow
将超出范围(我假设您使用的是ARC),因此窗口控制器将被销毁,窗口将关闭



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

什么会让您得出这样的结论呢?因为没有其他代码错误,调用self可能是答案。正如我现在所看到的,我们正在研究一个解决方案,而你只是对没有附加值的解决方案进行评论。什么会让你得出这样的结论呢?因为没有其他代码错误,调用self可能是答案。正如我现在看到的,我们正在开发一个解决方案,而您只是对没有附加值的解决方案进行评论。它告诉我,保留是不可用的。。。这是什么意思?哦,这意味着您正在使用ARC rt??如果再次调用
loadWindowNew:
,会发生什么情况?请参阅此loadWindowNew操作方法中最后一行的内容[self.windowController showWindow:self];它只能打开窗户一次。如果要打开窗口的多个实例,请使用此[self.arcWindowController loadWindow];[self.arcWindowController loadWindow];这将加载窗口的多个实例。请试着告诉我,保留是不可能的。。。这是什么意思?哦,这意味着您正在使用ARC rt??如果再次调用
loadWindowNew:
,会发生什么情况?请参阅此loadWindowNew操作方法中最后一行的内容[self.windowController showWindow:self];它只能打开窗户一次。如果要打开窗口的多个实例,请使用此[self.arcWindowController loadWindow];[self.arcWindowController loadWindow];这将加载窗口的多个实例。请尝试一下,如果你看我的代码,我已经声明了相同的代码。我是指窗口控制器的实例变量。我不明白你的代码有什么不同?你能解释一下吗?谢谢澄清:)@hussainShabbir我没有显示创建实例变量的代码,但我一直想告诉你的是,如果已经存在另一个窗口控制器,你需要防止创建另一个窗口控制器<代码>如果(!self.windowcontroller){self.windowcontroller=/*alloc*/;}。如果您查看我的代码,我已经声明了相同的代码。我是指窗口控制器的实例变量。我不明白你的代码有什么不同?你能解释一下吗?谢谢澄清:)@hussainShabbir我没有显示创建实例变量的代码,但我一直想告诉你的是,如果已经存在另一个窗口控制器,你需要防止创建另一个窗口控制器<代码>如果(!self.windowcontroller){self.windowcontroller=/*alloc*/;}。