【问题标题】:How to open a new window in cocoa mac application with a button如何使用按钮在可可mac应用程序中打开一个新窗口
【发布时间】:2013-10-08 03:48:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: objective-c macos cocoa


    【解决方案1】:

    答案的关键是范围:

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

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

    使它成为一个实例变量,最好是只创建一次。

    【讨论】:

    • 如果你看我的代码,我已经声明了相同的。我的意思是窗口控制器的实例变量。我没有得到你的代码有什么不同?你能解释一下吗??
    • 感谢您的澄清:)
    • @hussainShabbir 我没有展示创建实例变量的代码,但我一直试图告诉你的是,如果已经创建另一个窗口控制器,你需要防止创建另一个窗口控制器存在; if (!self.windowcontroller) { self.windowcontroller = /* alloc */; }.
    【解决方案2】:

    尝试在controllerWindow之前调用一个self

    像这样:

    [self.controllerWindow showWindow:self];
    

    【讨论】:

    • 什么会让你得出这样的结论?
    • 因为没有其他代码错误,调用 self 可能是答案。正如我现在所看到的,我们正在研究解决方案,而您只是在评论没有附加价值的解决方案。
    【解决方案3】:

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

    #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
    

    【讨论】:

    • 它告诉我,retain 是不可用的......它是什么人?
    • 哦,这意味着您正在使用 ARC rt??
    • 如果再次调用loadWindowNew:会发生什么?
    • 看这个loadWindowNew动作方法最后一行写的是[self.windowController showWindow:self];它只会打开一次窗口。如果要打开多个窗口实例,请使用此 [self.arcWindowController loadWindow];
    • [self.arcWindowController loadWindow];这将加载多个窗口实例。请尝试
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-29
      • 2012-06-17
      • 2015-07-13
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多