objective-c - 如何使用单个 NSValueTransformer 子类切换多个菜单项的标题

标签 objective-c cocoa interface-builder cocoa-bindings

我想进行一些绑定(bind),根据文本字段中的单个数值来切换弹出菜单中的项目标题。让我解释一下:

这是我的用户界面:

a text field and a pop up menu

the pop up menu

我希望我的菜单项根据文本字段中的数字自动调整为单数或复数。例如,当我在框中输入“1”时,我希望菜单项标记为“分钟”、“小时”和“天”。当我输入“4”时,我希望菜单项标记为“分钟”、“小时”和“天”。

迄今为止我做了什么:

  1. 我将三个菜单项的标签绑定(bind)到与文本字段的值相同的键路径。
  2. 我创建了一个 NSValueTransformer 子类来解释文本字段中的值并返回单数或复数以用作项目标题。
  3. 我将此值转换器应用于三个绑定(bind)。

问题:

我的值转换器可以返回单数或复数,但它无法根据其应用的菜单项设置适当的字符串。

在我看来,值转换器是通用的,不能为不同的目的地返回不同的值。这意味着要自动更改三个标题,我需要三个不同的值转换器,为每个菜单项返回适当的字符串。这似乎根本不是最佳选择。

理想情况下,当文本字段的值大于一或类似的值时,我能够将存储在目标菜单项(假设在项目的标签属性中)中的字符串与值转换器中的“s”组合起来将使我能够对所有菜单项使用单值转换器。

是不是我漏掉了什么?什么是理想的解决方案?

最佳答案

好吧,这可能不是一个理想的解决方案,但你可以考虑一下:如果你从代码中设置值转换器(而不是在 IB 中),你可以实例化同一类的 3 个不同的转换器。你可以给你的值转换器一个 ivar NSString *unit (并添加类似 [[MyValueTransformer alloc] initWithUnit:] 的内容)以允许每个返回自己的字符串,但您仍然只需编写一次值转换器的代码。

(另外,如果您打算考虑使您的应用程序可本地化,那么简单地附加一个“s”来创建复数形式是行不通的。您当然可以为 NSString *singularNSString *plural 添加 ivars来做到这一点。)

<小时/>

编辑:等等,我刚刚意识到你可以注册值转换器!如果您将它们注册为 MyValueTransformerHoursMyValueTransformerMinutes (通过在代码中手动alloc ating和init ializing它们),您可以从Interface Builder中使用它们。另请参阅https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ValueTransformers/Concepts/Registration.html#//apple_ref/doc/uid/20002166-BAJEAIEE .

关于objective-c - 如何使用单个 NSValueTransformer 子类切换多个菜单项的标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3809161/

相关文章:

ios - AVCaptureSession 和背景音频 iOS 7

objective-c - awakeFromNib、applicationWillFinishLaunching 和 applicationDidFinishLaunching 的顺序?

xcode - 界面生成器无法打开

iphone - 在 IB 中编辑 UIScrollView 的最简单方法

macos - 如何获取 NSEvent 时间戳(以毫秒为单位)?

ios - 有没有办法以编程方式在 IB 中设置约束?

ios - 核心剧情: Creating a CPTImage with imageWithCGImage

ios - 如何防止循环引用

ios - 使用 UIPageViewController 显示用户内容后设置 MFSideMenu - iOS

ios - Objective-C:像 2014-02-02T20:55:31.555Z 这样的日期的日期格式是什么