如何将 NSPopUpButton 与测量单位选择连接到 NSTextField 的呈现方式?
Posted
技术标签:
【中文标题】如何将 NSPopUpButton 与测量单位选择连接到 NSTextField 的呈现方式?【英文标题】:How to connect NSPopUpButton with measurement unit choices to the way a NSTextField is presented? 【发布时间】:2014-05-04 18:56:51 【问题描述】:在核心数据实体中,我有一个“长度”属性。我以厘米为单位保存长度。
我想让用户能够查看和编辑以厘米或英寸为单位的长度。所以我在 NSPopUpButton 旁边放置了一个 NSTextField,以 cm 和 inch 为选项。
根据 NSPopUpButton 的选择来格式化 NSTextField 的最佳方式是什么?如果这个问题是合理的,我希望尽可能多地使用绑定。
我看到有
NSNumberFormatters 和 NSValueTransformers或者我可以编写自定义代码来转换单位?
解决这个问题最优雅的方法是什么?
【问题讨论】:
【参考方案1】:如果您将用户的 cm/in 选择保留为具有实体属性的每个实体选择,您可以使用值绑定和自定义值转换器来实现,该转换器在文本字段上进行反向转换,即 cm/在弹出窗口的选择绑定中,以及实体上的 keyPathsForValuesAffectingLength 类方法。
如果属性 displayInInches——或任何你称之为的属性——被注册为影响长度值的 keyPath,则在切换弹出窗口时将调用自定义值转换器,并且文本字段将更新。
如果 cm/in 选项来自用户默认值(如果更改不是针对每个实例),您可以将弹出窗口绑定到用户默认值并让自定义值转换器考虑默认值,但更改该弹出窗口不会t 刷新文本字段。所以我认为你需要一个 IBAction 来触摸实例的长度。
您可以在此基础上添加一个数字格式化程序 - 特别是当您的值转换器转换为 NSNumber 而不是 NSString 时 - 但主要用于本地化和有效数字的数量,而不是用于 cm/in 数学。
【讨论】:
谢谢。我会尝试你的想法。没有涉及默认值,我不想存储每个实体的选择。在我的用例中,用户可能希望查看/输入长度,一次是英寸,一次是厘米,这取决于现实世界数据如何呈现给她/他。 如果弹出状态是仅查看,则值转换也必须是仅查看。所以也许这确实会让你转向一个定制的NSFormatter
,但我很少听到这样的事情。我的“答案”是一个较长的评论,所以如果可行,请自己回答!
我做了一个自定义的CmToInchValueTransformer
并且已经成功地测试了它,当我将它分配给一个NSTextField
耐用。现在缺少的是我可以连接它的方式,以便在 NSPopUpButton
中选择 inch 时使用它,而在选择 cm 时不使用它。
转换器需要通过插座访问弹出按钮的状态。并且当通过动作改变其状态时,弹出窗口需要触发重新评估。这是因为按钮状态只存储在视图中而不是模型中。以上是关于如何将 NSPopUpButton 与测量单位选择连接到 NSTextField 的呈现方式?的主要内容,如果未能解决你的问题,请参考以下文章
从出现在 NSPopUpButton 列表中的核心数据实体中过滤条目
NSPopUpButton:多个值和 selectedIndex 绑定