0

我已将我的 UI 拆分为各种 nib 文件。

现在,我使用两个nswindowcontroller子类nsarraycontrollernsobjectcontrollerIBOutlets。nwwindowcontroller 是其各自 nib 中的文件所有者。

控制器在 InterfaceBuilder (IB) 中分配。

以前在一个笔尖中,我使用“选择”的控制器键和“自我”的模型键路径将员工绑定nsarraycontroller到单个员工nsobjectcontroller

现在,我尝试通过代码“绑定”它们,因此

- (IBOutlet) showEmployeeWindow:(id)sender;

//load a window from a nib file.
    ...

// Get the employee arraycontroller.
NSArrayController *employeesController = [employeesWindowController employeeArrayController];  

// Get the selected employee from the employeeS controller
id employee = [empController selection]; 

//now the employee 
NSObjectController *emplController = [singleEmployeeWindowController employeeController];

//Set the content object of the employee controller as the nsset called employees.
[emplController setContent: employee]; 

//Show the window.
[singleEmployeeWindowController showWindow:sender];

    ...

}

问题。

调试确实显示所选员工的不同内存地址。即线

id employee = [empController selection]; 
// Get the selected employee from the employeeS controller

似乎换了一个员工。

但我一直看到第一个员工从来没有被选中。

所选员工永远不会被设置为内容——或者更准确地说,所选员工不会替换默认的第一个员工。

请注意,每个nswindowcontroller都有一个nsmanagedobject通过 nsdocument 设置的上下文。它是笔尖中的文件所有者。

4

1 回答 1

4

是不是经常这样。拔掉头发 2 天后。提出问题并在 1/2 小时内得到答案。

所以秘密本质上是可可绑定,特别是键值绑定

该文档是典型的 yackademic yadda yadda。级联线索实际上来自类似的堆栈溢出问题

所以需要做的就是像这样将两个控制器连接在一起。

NSArrayController *source = [employeesWindowController employeeArrayController]];
NSObjectController *destination = [singleEmployeeWindowController employeeController];

[destination bind:@"contentObject" toObject:source withKeyPath:@"selection.self" options:nil];

语法遵循 Interface Builder 绑定的语法。

Bind to: Content Object 
Content Key: selection
ModelKeyPath: self

所以它是一个非常容易的一个班轮。

将 a绑定NSLabel到控制器。在IB

Bind to: Value 
Content Key: selection
ModelKeyPath: name

在代码中,

[label bind:@"value" toObject:controllerRef withKeyPath:@"selection.name" options:nil];

并且这些选项模仿了“不适用键的提升”等等。有关详细信息,请参阅 yackademic 文本。

于 2013-06-04T20:44:38.880 回答