У меня есть 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»):
![menu v1](https://i.stack.imgur.com/clI12.png)
Вот после звонка addItemsToPopUp:
![menu v2](https://i.stack.imgur.com/XUAe9.png)
Вот после звонка nameBlankItem:
![menu v3](https://i.stack.imgur.com/nTv5O.png)
Затем я снова позвонил addItemsToPopUp:
:
![menu v4](https://i.stack.imgur.com/4gxWO.png)
Теперь я, наконец, сделаю выбор и снова всплываю меню:
![menu v5](https://i.stack.imgur.com/bIgS2.png)
Куда ушел * 1034?
В моей настоящей программе я хочу, чтобы пункты меню были "1" .. "n" (n определяется числом элементов в вычисленном NSArray). Я открыт для альтернативных подходов, но я надеюсь, что решение продолжает использовать NSPopupButton.
(В случае, если это имеет значение, я использую Xcode 3.1.2 под OS X 10.5.8, но также тестировал с Xcode 3.2 под OS X 10.6.8.)