2010-05-12 56 views
2

我有一个NSTableView绑定到NSDictionaryController。我已经通过界面构建​​器设置了该内容字典。我的问题是,如何将对象添加到字典中,控制器将自动将其显示在表中并将其显示在字典中。添加对象到NSDictionaryController

我在关于NSArrayController的例子中看到,通过控制器而不是实际的数组添加新的对象,所以控制器看到了这个改变。然而,我没有看到用字典控制器做这件事的类似方式...

感谢您的帮助。

回答

4

那么我最终搞清楚了这一点。由于arraycontroller镜像使用数组,字典控制器会做同样的事情,但是事实并非如此。这个过程是一个有点不同......

所以,如果你有,你想添加值,因此可以进行任何更新绑定到它,你使用下面的过程dictionarycontroller:

//Creates and returns a new key-value pair to represent an entry in the 
//content dictionary. 
id newObject = [dictController newObject]; 
//Use NSDictionaryControllerKeyValuePair Protocol setKey 
[newObject setKey:@"Key"]; 
//Use NSDictionaryControllerKeyValuePair Protocol setValue 
[newObject setValue:@"value"]; 
//Add the object to the controller 
[dictController addObject:newObject]; 

这实际上,将更新两个字典控制器并将该值添加到内容字典中。在这种情况下,您不能使用setValue:ForKey,因为这不是在NSDictionaryControllerKeyValuePair协议中实现的方法。

我希望这可以帮助其他人使用这些控制器!

+0

这为我工作,但后来我发现这个问题,这似乎更与我想做的事http://stackoverflow.com/questions/1596229/nsdictionarycontroller-doesnt-seem-to对齐-observe-changes-to-content-dictionary – TodK 2010-07-14 17:26:27

0

jasons答案没有为我工作,因为在我的实现中,它遇到了一行错误[newObject setValue:@“value”],说多个方法被发现与不匹配的结果,我找不到任何其他方法将按照预期添加新条目。

经过大量的搜索和尝试的,我想出了这个解决方案: 刚刚续签结合每次的dictController需要更新,像这样:

[dictController bind:NSContentDictionaryBinding toObject:self withKeyPath:@"nameOfMyDictionary" options:nil]; 

所以在我的代码,我将项目添加到我的字典,并在显示我的字典的内容表之前,我重置绑定。这可能是一个肮脏的解决方案,但它为我工作。

+0

据我了解这个问题的问题是,NSMutableDictionary不会发布自己的键值观察通知。它会愉快地说出关键的“不管”是否发生了变化,但它并没有说嘿“我已经改变了”。这意味着绑定对象无法自行更新,因为它没有收到字典任何突变的通知。所以,当你每次更新内容时都要分配内容。您也可以在编辑内容字典之前和之后调用willChangeValueForKey:didChangeValueForKey。 – 2013-10-24 05:59:42

0

非常好!修改Swift3:

// Use NSDictionaryControllerKeyValuePair Protocol setKey 
    let temp = myDictionaryController.newObject() 
    temp.setValue(name, forKey: "key") 
    temp.setValue(list, forKey: "value") 
    myDictionaryController.addObject(temp)