【问题标题】:Programmatically create NSPopupButton and add items to list以编程方式创建 NSPopupButton 并将项目添加到列表
【发布时间】:2015-07-06 17:34:02
【问题描述】:

我已经能够以编程方式创建一个 NSPopupButton 并将其添加到我的窗口中,并且我可以通过相同的方法将项目添加到列表中,但我想弄清楚如何从另一个方法中将项目添加到它方法。

这是我目前的工作:

// in my .h file:
@interface AVRecorderDocument : NSDocument
{
    @private
    NSPopUpButton *button;   
}

@property (assign) IBOutlet NSWindow *mainWindow;

// in my .m file:
@implementation AVRecorderDocument
    @synthesize mainWindow;

    - (void)windowControllerDidLoadNib:(NSWindowController *) aController
    {
        NSView *superview = [mainWindow contentView];

        NSRect frame = NSMakeRect(10,10,149,22);
        NSPopUpButton *button = [[NSPopUpButton alloc]  initWithFrame:frame];

        [superview addSubview:button];
        [button release];
    }

    - (void)refreshDevices
    {
        // I'd like to add items to my popupbutton here:
        // [button addItemWithTitle: @"Item 1"];
    }

@end

在 refreshDevices 中我没有收到编译器错误,只是没有任何内容添加到弹出按钮中。从 -(id)init 调用方法 refreshDevices。我还尝试将 windowControllerDidLoadNib 中的代码放在我的 init 部分的顶部,但它甚至不会在那里创建弹出按钮。

【问题讨论】:

    标签: objective-c cocoa nspopupbutton


    【解决方案1】:

    你的代码有两个问题:

    1. 内部windowControllerDidLoadNib:

      您不会将新创建的按钮分配给您的 ivar,而只是分配给一个函数局部变量(与您的 ivar 同名)。

    2. 为什么refreshDevices内部什么都没有发生

      initwindowControllerDidLoadNib: 之前被调用,所以你的 ivar 是 nil(并且因为 1.)。向nil 发送消息没有任何作用。

    解决方案:

    1. windowControllerDidLoadNib: 中删除NSPopUpButton *,以便将新按钮分配给您的ivar,而不是某个函数局部变量。

    2. windowControllerDidLoadNib: 的末尾调用refreshDevices,或者在某些时候你知道windowControllerDidLoadNib: 已被调用,而你的按钮不是nil


    编辑:

    您应该记住,从超级视图中删除按钮的那一刻,它可能会被释放,因为您在创建后释放它。

    在它被解除分配的那一刻,你的button ivar 指向一个无效/解除分配的对象,在这种状态下使用时会导致未定义的行为。

    我建议release dealloc 内的按钮,这样您就可以确保在文档对象的整个生命周期内都有一个有效的对象。

    但我不知道您可能需要这种设计的确切用例。

    【讨论】:

    • 完美,做到了。谢谢你的帮助。我仍然掌握范围的窍门,以及我需要在哪里放置某些东西以使它们可用于我的所有方法。
    猜你喜欢
    • 2013-10-29
    • 1970-01-01
    • 2013-03-07
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    相关资源
    最近更新 更多