Objective c 使用NSManagedObject子类将NSPopupButton绑定到NSArrayController

Objective c 使用NSManagedObject子类将NSPopupButton绑定到NSArrayController,objective-c,macos,core-data,cocoa-bindings,nsarraycontroller,Objective C,Macos,Core Data,Cocoa Bindings,Nsarraycontroller,关于绑定一个NSpoupButton,似乎有很多问题,所以我觉得在这方面做了这么多的努力会好一点,但似乎没有一个能解决我的问题 我有一个NSManagedObject子类,它与另一个类有一对多的关系。假设Foo与Bar有关系,那么Foo有一个属性,它是一组Bar 我已经创建了一个NSArrayController,并将其内容集绑定到Foo对象和“bar”键路径 然后,我将NSPopupButton的内容绑定到数组控制器的arrangedObjects,将其ContentValue绑定到数组控制器

关于绑定一个NSpoupButton,似乎有很多问题,所以我觉得在这方面做了这么多的努力会好一点,但似乎没有一个能解决我的问题

我有一个NSManagedObject子类,它与另一个类有一对多的关系。假设Foo与Bar有关系,那么Foo有一个属性,它是一组Bar

我已经创建了一个NSArrayController,并将其内容集绑定到Foo对象和“bar”键路径

然后,我将NSPopupButton的内容绑定到数组控制器的arrangedObjects,将其ContentValue绑定到数组控制器的arrangedObject(控制器键)和“name”(我要显示的栏上的属性)


到目前为止,这一切都很好,但当我尝试将NSPoupButton的选定对象绑定到阵列控制器的选择时,NSPoupButton显示“FooBar的东西让我困惑,因此下面是我基于真实世界对象的示例

ExpenseTransaction具有属性(日期、trxDescription、类别、金额)

类别具有单个属性(名称)

ExpenseTransation.category是与类别的一对一关系(换句话说,一项交易只能属于一个类别)

Category.transactions与ExpenseTransage是一种对多关系(换句话说,许多交易可以属于同一类别)

用于创建新事务或编辑现有事务的UI使用NSPopupButton使用name属性显示可用类别的列表。对于现有事务,弹出窗口将显示所选事务类别

类别弹出窗口的绑定如下所示:

内容(类别.排列对象)

内容对象(Category.arrangedObjects)-我们希望链接到实际的类别,而不是其名称,因为属性是一种关系,而不是字符串值

内容值(Category.arrangedObjects.name)-我们希望在弹出列表中显示名称

所选对象(ExpenseTransaction.selection.category)

使用FooBar类比:

类别与ExpenseTransage有关系,因此类别具有属性(事务)这是一组ExpenseTransactions。现在这几乎与我的安排相反,所以我真的不知道如何或为什么要用ExpenseTransactions对象填充弹出窗口,因为弹出窗口中只有一个选定的项目可以与类别对象关联,而事实上你需要整个集合关联。然而,另一种方式是around工作正常,因为弹出窗口将包含所有Foo项的列表,因此每当您选择一个Bar项时,可以从弹出窗口中选择相应的Foo项


希望这是有意义的。

NSPopupButton可以很好地使用绑定,我一直都在使用它。我将挖掘一个示例,稍后为您发布。我的用例与您的略有不同。我使用弹出按钮只是为了选择可见的顶级对象(在我的示例中称为条形图)我创建Foo对象只是为了有一个对象,它包含所有条的集合,所以我有一些东西可以绑定数组控制器。我一直在尝试将弹出窗口绑定到arrangedObjects中的选择,因为它实际上就是一个选择。你认为这是因为我需要将选择存储到模型上吗我试着将选择绑定到窗口中的一个属性上(假设选择更多的是与视图有关,而不是与模型有关),但是当弹出窗口确实改变了该属性指向Popop的内容时,Popop本身总是说“无值”“。仍然不确定我是否完全理解您的UI试图做什么,但您可能希望创建两个ArrayController,FooArray和BarArray。将两者都设置为实体模式,并将实体名称分别设置为Foo和Bar。现在,为了确保BarArray仅包含与FooArray中所选项目相关的项目,请将BarArray内容集绑定到(FooArray.selection.bar),其中bars是“多对多”关系(属性)。现在BarArray应该只包含与所选Foo项相关的条的子集。我不明白的是,为什么要将弹出窗口的所选项绑定到任何东西,因为模型中似乎没有对应关系。弹出窗口中所选项目的含义是什么?或者换句话说,用户通过从弹出窗口中选择一个包含所有属于所选Foo项目的条目的项目来实现什么。如何选择Foo项?再次阅读上面的注释似乎您拥有Foo对象的唯一原因是您可以将数组控制器绑定到它。为什么不能简单地创建一个ArrayController并将其实体设置为Bars?这样它将包含数据库中的所有Bars。设置BarSarray控制器不需要任何其他绑定。我假设Bars是数据库中的一个实体(或托管对象)。然后将弹出窗口绑定到BarsArray控制器,并将实例变量绑定到所选的弹出窗口对象。
Unacceptable type of value for attribute: property = "name"; desired type = NSString; given type = Bar;