objective-c - 以编程方式创建 NSPopupButton 并将项目添加到列表

标签 objective-c cocoa nspopupbutton

我已经能够以编程方式创建一个 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中我没有收到编译器错误,只是没有添加任何内容到弹出按钮中。方法refreshDevices 是从-(id)init 调用的。我还尝试将 windowControllerDidLoadNib 内的代码放在 init 部分的顶部,但它甚至不会在那里创建弹出按钮。

最佳答案

您的代码有两个问题:

  1. windowControllerDidLoadNib 内部:

    您不会将新创建的按钮分配给您的 ivar,而仅分配给函数局部变量(与您的 ivar 具有相同的名称)。

  2. 为什么 refreshDevices 内没有任何反应

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

解决方案:

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

  2. windowControllerDidLoadNib: 末尾调用 refreshDevices 或在您知道 windowControllerDidLoadNib: 已被调用且您的按钮已调用的某个时刻不是nil

<小时/>

编辑:

您应该记住,当您从 super View 中删除按钮时,它可能会被释放,因为您在创建后释放了它。

释放时,您的 button ivar 指向无效/已释放的对象,在这种状态下使用时会导致未定义的行为。

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

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

关于objective-c - 以编程方式创建 NSPopupButton 并将项目添加到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31235454/

相关文章:

ios - 如何在自定义单元格中保存单击的按钮索引路径?

objective-c - NSOutlineView 拖放

cocoa - 在核心数据中复制/粘贴自定义托管对象

iphone - 设置包中的更新版本失败 iphone

ios - 在 UITableviewCell 中选择行时遇到问题

objective-c - 工具栏中的 NSPopUpButton 具有类似于 Pages.app UI 的固定图像

macos - 如何从 NSPopUpButton 获取所选项目?

cocoa - 如何更改 NSPopUpButton 中 NSMenuItem 的简短显示形式?

objective-c - 无法捕捉 OpenGL 和顶点数组对象的错误

objective-c - 2 应该相等的 NSDates 不是吗?