Cocoa 绑定NSpoupButton';s所选标识符

Cocoa 绑定NSpoupButton';s所选标识符,cocoa,cocoa-bindings,nspopupbutton,Cocoa,Cocoa Bindings,Nspopupbutton,我有几个弹出按钮,其所选标记保存在用户默认设置中(通过在绑定检查器中绑定所选标记)。现在,我不想保存一个整数,而是想保存一个字符串值(原因很简单,它使用户的默认值更“可读”且更安全),但不幸的是,我没有找到绑定弹出按钮所选标识符的方法。有解决此问题的方法吗?NSpoupButton的绑定可能会有点混乱。各种Content*绑定用于为按钮提供可能的选择列表内容本身用于提供由弹出按钮中的项目表示的对象列表内容值用于提供弹出按钮中显示的实际值。例如,内容可能绑定到模型对象数组,而内容值绑定到这些对象上

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

NSpoupButton的绑定可能会有点混乱。各种Content*绑定用于为按钮提供可能的选择列表<代码>内容本身用于提供由弹出按钮中的项目表示的对象列表<代码>内容值用于提供弹出按钮中显示的实际值。例如,
内容
可能绑定到模型对象数组,而
内容值
绑定到这些对象上的特定键路径,例如
名称
,因为您希望在弹出按钮本身中显示每个项的名称属性值

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

总之,在您不使用内容绑定的情况下,这意味着您有两种选择:

  • 选定值
    绑定到用户默认值
  • 创建一个包含
    标识符
    属性和
    名称
    (或任何您想称之为的)属性的基础模型类。将
    内容
    绑定到这些对象的数组,并将
    内容值
    绑定到
    该数组。名称
  • 选择1 这个选项简单得多。只需设置选定的值绑定,即可完成。它的主要缺点是实际显示的字符串是存储在用户默认值中的内容。这意味着,如果更改项目的措辞,则先前存储的选择将不会恢复,即使它直接对应于新措辞的项目。更重要的是,让本地化字符串(或可能本地化的字符串)具有语义重要性不是一个好主意

    选择2 这需要更多的工作(和代码),但它将以一种健壮的、“正确的”方式解决您的问题。例如:

    @objcMembers类选项:NSObject{
    动态变量名:String
    动态变量标识符:字符串
    init(名称:String,标识符:String){
    self.name=名称
    self.identifier=标识符
    }
    }
    类ViewController:UIViewController{
    @objc动态变量选项ForPopup=[选项(名称:“项目A”,标识符:“id 1”),
    选项(名称:“B项”,标识符:“id 2”),
    选项(名称:“项目C”,标识符:“id 3”)]
    }
    
    绑定:

    • 内容
      至视图控制器-
      弹出选项
    • 内容值
      至ViewController-
      弹出窗口的选项。名称
    • 所选值
      到共享用户默认控制器-控制器键:
      ,模型键路径:
      WhateverUserDefaultsKeyYouWant
    例子
    我在这里创建了一个实现选项2的示例项目:

    绑定所选对象。您绑定了弹出按钮的内容吗?我没有绑定弹出按钮的内容,我在xib编辑器中创建了所有项目。您认为这是唯一的方法吗?不,有很多方法,但是
    nspoupbutton
    没有选定的标识符绑定或
    selectItem(withIdentifer:)
    方法。如果要绑定选定对象,必须在代码中或通过绑定内容对象设置菜单项的
    representedObject