我正在尝试实施一个根据NSPopUpButton
状态更改标签的系统
到目前为止,我已尝试执行下面代码中显示的内容,但每当我运行它时,代码只会跳转到else
子句,抛出警报
- (IBAction)itemChanged:(id)sender {
if([typePopUp.stringValue isEqualToString: @"Price per character"]) {
_currency = [currencyField stringValue];
[additionalLabel setStringValue: _currency];
}
else if([typePopUp.stringValue isEqualToString: @"Percent saved"]) {
_currency = additionalLabel.stringValue = @"%";
}
else alert(@"Error", @"Please select a calculation type!");
}
所以这里的任何人都知道如何解决这个问题吗?
答案 0 :(得分:5)
@hamstergene是在正确的轨道上,但是正在比较菜单项的标题,而不是比较标签,这是错误的,原因如下:
说了这么多,NSPopUpButton
使得很难在菜单项中插入标签,因此您需要使用所选项目的索引:
假设您使用以下方式创建菜单项:
[typePopUp removeAllItems];
[typePopUp addItemsWithTitles: [NSArray arrayWithObjects: @"Choose one...", @"Price per character", @"Percent saved", nil]];
然后创建一个匹配数组中标题顺序的enum
:
typedef enum {
ItemChooseOne,
ItemPricePerCharacter,
ItemPercentSaved
} ItemIndexes;
然后比较所选的项目索引,如下所示:
- (IBAction)itemChanged:(id)sender {
NSInteger index = [(NSPopUpButton *)sender indexOfSelectedItem];
switch (index) {
case ItemChooseOne:
// something here
break;
case ItemPricePerCharacter:
_currency = [currencyField stringValue];
[additionalLabel setStringValue: _currency];
break;
case ItemPercentSaved:
_currency = @"%"; // See NOTE, below
additionalLabel.stringValue = @"%";
break;
default:
alert(@"Error", @"Please select a calculation type!");
}
}
注意您的代码中的以下行不正确:
_currency = additionalLabel.stringValue = @"%";
多项作业有效,因为x = y
的结果为y
。涉及二传手时不是这种情况。更正的代码在上面。
编辑这个答案经过大量编辑,后面是OP的更多信息。
答案 1 :(得分:2)
在NSPopUpButton
中查询当前所选项目的标题:
NSMenuItem* selectedItem = [typePopUp selectedItem];
NSString* selectedItemTitle = [selectedItem title];
if ([selectedItemTitle isEqualTo: ... ]) { ... }
请注意,比较UI字符串是一个非常糟糕的主意。 UI中的最轻微变化将立即破坏您的代码,并且您正在阻止将来的本地化。您应该使用-[NSMenuItem setTag:
]或-[NSMenuItem setRepresentedObject:
]为每个项目分配数字或对象值,并使用它们来识别项目。