我有一个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
这是窗口首次出现时的popUp菜单(它在IB中有三个名为“1”,“2”和“3”的项目):
这是在致电addItemsToPopUp:
这是在致电nameBlankItem:
然后我又打电话给addItemsToPopUp:
:
现在我终于做出选择并再次弹出菜单:
4
去了哪里?
在我的真实程序中,我确实希望菜单项为“1”..“n”(n由计算的NSArray中的项目数定义)。我对其他方法持开放态度,但我希望解决方案继续使用NSPopupButton。
(如果重要的话,我在OS X 10.5.8下使用Xcode 3.1.2,但在OS X 10.6.8下使用Xcode 3.2进行了测试。)
答案 0 :(得分:0)
我通过将NSPopUpButton的Content Values属性绑定到对象中的数组来解决了这个问题。因此,不是手动操作按钮的项目数组以及Cocoa在幕后做的事情,而是完全控制内容。