绑定NSPopupButton的选定标识符

时间:2019-11-12 09:32:50

标签: cocoa cocoa-bindings nspopupbutton

我有几个弹出按钮,其所选标签保存在用户默认设置中(通过在“绑定”检查器中绑定所选标签)。现在,我不想保存一个整数,而是想保存一个字符串值(出于简单的原因,它使用户默认值更具“可读性”和故障保护功能),但是不幸的是,它没有找到绑定弹出按钮的选定标识符的方法。有解决这个问题的方法吗?

1 个答案:

答案 0 :(得分:0)

NSPopupButton的绑定可能会有些混乱。各种Content *绑定用于向按钮提供其可能的选择列表。 Content本身用于提供由弹出按钮中的项目表示的对象列表。 Content Values用于在弹出按钮中提供显示的的实际值。例如,Content可能绑定到模型对象数组,而Content Values绑定到那些对象上的特定键路径,例如name,因为您想显示值弹出按钮本身中每个项目的name属性。

类似地,用于选择的绑定对应于该系统。 Selected Object意味着,当选择给定项时,Content数组中的基础完整对象将被选择/设置在bound属性上,而不仅仅是简单显示的字符串(或数字等)值。另一方面,Selected Value实际上仅绑定显示的值。

放在一起,在您不使用内容绑定的情况下,这意味着您有两个选择:

  1. Selected Value绑定到用户默认设置。
  2. 使用identifier属性和name(或任何您想调用的属性)属性创建基础模型类。将Content绑定到这些对象的数组,并将Content Values绑定到thatArray.name

选项1

此选项要简单得多。只需设置选定的值绑定就可以了。它的主要缺点是实际显示的字符串是存储在用户默认值中的东西。这意味着,如果您更改项目的措辞,则即使先前存储的选择直接对应于新措辞的项目,也不会恢复该选择。更重要的是,使本地化(或潜在本地化)的字符串在语义上很重要不是一个好主意。

选项2

这需要花费更多的工作(和代码),但是它将以健壮的“正确”方式解决您的问题。例如:

@objcMembers class Option: NSObject {
  dynamic var name: String
  dynamic var identifier: String

  init(name: String, identifier: String) {
    self.name = name
    self.identifier = identifier
  }
}

class ViewController: UIViewController {
  @objc dynamic var optionsForPopup = [Option(name: "Item A", identifier: "id 1"),
                                       Option(name: "Item B", identifier: "id 2"),
                                       Option(name: "Item C", identifier: "id 3")]
}

绑定:

  • Content到ViewController-optionsForPopup
  • Content Values到ViewController-optionsForPopup.name
  • Selected Value到共享的用户默认值控制器-控制器密钥:values,模型密钥路径:WhateverUserDefaultsKeyYouWant

示例

我创建了一个示例项目,该示例在此处实现了选项2:https://github.com/armadsen/PopupDemo