0

我有一个 NSPopupButton,其选择索引绑定到 NSWindowController 子类中的属性。在 IB 中,按钮以几个项目开始。该属性的值来自 NSUserDefaults 并且可能超过 NSPopupButton 首次实例化时的项目数。这会导致在列表末尾插入一个空白项。如果我将项目附加到按钮,自动创建的空白项目仍然存在。但是当我做出选择时它消失了。如果我在选择之前更改了空白项目的标题,该项目仍然会消失。

我已将问题提炼为以下代码:

@interface PopUpWindowController : NSWindowController {
    NSUInteger popUpValue;

    IBOutlet NSPopUpButton *popUp;
}

@property NSUInteger popUpValue; //popUp's Selected Index is bound to this property

-(IBAction)addItemsToPopUp:(id)sender;
-(IBAction)nameBlankItem:(id)sender;

@end


@implementation PopUpWindowController

@synthesize popUpValue;

-(id)init {
    if (self = [super initWithWindowNibName:@"PopUpWindow"]) {
        popUpValue = 5; //In my real program this comes from NSUserDefaults
    }
    return self;
}

-(IBAction)addItemsToPopUp:(id)sender {
    //Add three items to popUp
    NSUInteger lastNewItem = [popUp numberOfItems] + 3;
    for (NSUInteger newItem = [popUp numberOfItems]; newItem < lastNewItem; newItem++) {
        [popUp addItemWithTitle:[NSString stringWithFormat:@"%d", newItem + 1]];
    }
    self.popUpValue = 5;
}

-(IBAction)nameBlankItem:(id)sender {
    NSArray *items = [popUp itemArray];
    for (NSUInteger i = 0; i < [items count]; i++) {
        if (![[[items objectAtIndex:i] title] length]) {
            //item title is blank so set it to the item number
            [[items objectAtIndex:i] setTitle:[NSString stringWithFormat:@"%d", i + 1]];
        }
    }
}

@end

这是窗口第一次出现时弹出的菜单(它在 IB 中有三个项目,名为“1”、“2”和“3”):

菜单 v1

这是调用后addItemsToPopUp:

菜单 v2

这是调用后nameBlankItem:

菜单 v3

然后我又打电话addItemsToPopUp:

菜单 v4

现在我终于做出选择,再次弹出菜单:

菜单 v5

去哪儿了4

在我的真实程序中,我确实希望菜单项为“1”..“n”(n 由计算的 NSArray 中的项目数定义)。我对替代方法持开放态度,但我希望该解决方案继续使用 NSPopupButton。

(以防万一,我在 OS X 10.5.8 下使用 Xcode 3.1.2,但也在 OS X 10.6.8 下使用 Xcode 3.2 进行了测试。)

4

1 回答 1

0

我通过将 NSPopUpButton 的 Content Values 属性绑定到我的对象中的数组解决了这个问题。因此,我无需手动操作按钮的项目数组以及 Cocoa 在幕后所做的任何事情,而是完全控制内容。

于 2012-01-08T18:54:58.590 回答