gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:38:25 39 4
gpt4 key购买 nike

我已经能够以编程方式创建一个 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/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com