我有几个弹出按钮,其所选标签保存在用户默认设置中(通过在“绑定”检查器中绑定所选标签)。现在,我不想保存一个整数,而是想保存一个字符串值(出于简单的原因,它使用户默认值更具“可读性”和故障保护功能),但是不幸的是,它没有找到绑定弹出按钮的选定标识符的方法。有解决这个问题的方法吗?
答案 0 :(得分:0)
NSPopupButton
的绑定可能会有些混乱。各种Content *绑定用于向按钮提供其可能的选择列表。 Content
本身用于提供由弹出按钮中的项目表示的对象列表。 Content Values
用于在弹出按钮中提供显示的的实际值。例如,Content
可能绑定到模型对象数组,而Content Values
绑定到那些对象上的特定键路径,例如name
,因为您想显示值弹出按钮本身中每个项目的name属性。
类似地,用于选择的绑定对应于该系统。 Selected Object
意味着,当选择给定项时,Content
数组中的基础完整对象将被选择/设置在bound属性上,而不仅仅是简单显示的字符串(或数字等)值。另一方面,Selected Value
实际上仅绑定显示的值。
放在一起,在您不使用内容绑定的情况下,这意味着您有两个选择:
Selected Value
绑定到用户默认设置。identifier
属性和name
(或任何您想调用的属性)属性创建基础模型类。将Content
绑定到这些对象的数组,并将Content Values
绑定到thatArray.name
。此选项要简单得多。只需设置选定的值绑定就可以了。它的主要缺点是实际显示的字符串是存储在用户默认值中的东西。这意味着,如果您更改项目的措辞,则即使先前存储的选择直接对应于新措辞的项目,也不会恢复该选择。更重要的是,使本地化(或潜在本地化)的字符串在语义上很重要不是一个好主意。
这需要花费更多的工作(和代码),但是它将以健壮的“正确”方式解决您的问题。例如:
@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