如何正确使用NSPopUpButton

问题描述 投票:0回答:2

我有一个 NSPopUpButton,我想用它来选择打开文件的文本编码。

我已经有了一些如何实现这个的想法,但是当我开始学习 Objective-C 和 Cocoa 时,我几乎确信有更好的方法来实现我想要的。

我需要一个带有编码名称和关联的 NSStringEncoding 值的 NSString。

我曾想过创建一个表示编码(名称和值)的类,并拥有一个包含此类对象的 NSArray,然后用该数组的内容填充 NSPopUpButton,但我认为应该有更好的方法。

我对 NSDictionary 类不太熟悉,但我怀疑这应该会让事情变得更容易。

有人可以给我提示吗?

objective-c cocoa nsdictionary nspopupbutton nsstringencoding
2个回答
6
投票

创建字典,以编码作为值,以 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。


0
投票

你可以更简单地解决这个问题。

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]

然后,在您的菜单操作中:

  • (IBAction)encodingMenuAction:(id)发送者{ NSStringEncoding selectedEncoding = (NSStringEncoding)[发件人标签]; // 对编码做任何你想做的事 }

或者,您随时想知道当前选择的编码是什么:

   NSStringEncoding selectedEncoding = (NSStringEncoding)[[pop selectedItem ] tag];
© www.soinside.com 2019 - 2024. All rights reserved.