绑定NSPopupButton的选定标识符

问题描述 投票:1回答:1

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

cocoa cocoa-bindings nspopupbutton
1个回答
0
投票

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

类似地,用于选择的绑定对应于此系统。 Selected Object表示当选择给定项时,将在/ bound属性上选择/设置Content数组中的基础完整对象,而不仅仅是简单显示的字符串(或数字等)值。另一方面,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

© www.soinside.com 2019 - 2024. All rights reserved.