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*/;}。