我有一个 NSPopUpButton,我想用它来选择打开文件的文本编码。
我已经有了一些如何实现这个的想法,但是当我开始学习 Objective-C 和 Cocoa 时,我几乎确信有更好的方法来实现我想要的。
我需要一个带有编码名称和关联的 NSStringEncoding 值的 NSString。
我曾想过创建一个表示编码(名称和值)的类,并拥有一个包含此类对象的 NSArray,然后用该数组的内容填充 NSPopUpButton,但我认为应该有更好的方法。
我对 NSDictionary 类不太熟悉,但我怀疑这应该会让事情变得更容易。
有人可以给我提示吗?
创建字典,以编码作为值,以 NSPopUpButton 的名称作为键
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
NSNumber numberWithLong:NSASCIIStringEncoding], @"ASCII",
[NSNumber numberWithLong:NSUnicodeStringEncoding], @"Unicode", nil];
然后将它们添加到 NSPopUpButton 中
[myPopUpButton addItemsWithTitles:[dict allKeys]]
然后获取用户选择的编码
[dict objectForKey:[myPopUpButton titleOfSelectedItem]]
注意:您需要将字符串编码枚举包装在一个对象中,例如 NSValue 或 NSNumber。
你可以更简单地解决这个问题。
NSPopupButton
有一个 NSMenu 对象,其中包含您让用户选择的所有 NSMenuItem
。
NSPopupButton 的基本 API 只允许添加简单的“itemWithTitle”,但不能自定义和修改创建的菜单项。
- (void)addItemWithTitle:(NSString *)title;
但是一旦你调用了这个,你就可以使用以下
NSPopupButton
API:
@property (nullable, readonly, strong) NSMenuItem *lastItem;
获取使用指定标题创建的内部 NSMenuItem 对象,并直接对其进行自定义。
在这里 - 您可以使用 NSMenuItem 可以分配一个数字“标签”这一事实,并使用您的实际编码(这是一个整数)来标记菜单项。
然后,处理用户的选择就很简单了——调用的 NSPopUpButton action 总是为您提供“发送者”(发送操作的对象),它将是用户选择的实际 NSMenuItem。您只需向其询问其标签即可 - 就可以了。用户选择的文本编码。
所以...代码将如下所示:
NSPopUpButton *pop = [[NSPopUpButton alloc] init];
// add a new menu item for ASCII
[pop addItemWithTitle:@"ASCII Encoding";
NSMenuItem *popUpItem = pop.lastItem;
[popUpItem setTag: NSASCIIStringEncoding]
然后,在您的菜单操作中:
或者,您随时想知道当前选择的编码是什么:
NSStringEncoding selectedEncoding = (NSStringEncoding)[[pop selectedItem ] tag];