我有一个 NSMutableArray
(包含 NSMutableDictionary
实例)绑定(bind)到 NSArrayController
(NSArrayController
是依次绑定(bind)到 NSTableView
列)。
什么是对 Cocoa 和 KVO 最友好的方式,以编程方式:
- 向数组添加一个新的空对象 (
NSMutableDictionary
)? - 要删除当前选定的对象吗? (删除后,应选择前一项 - 如果存在 - )
我一直以一种我不太喜欢的方式来做这件事 - 而且我确信这不是最好的方法(对于如此简单的事情来说,代码行太多:在 Cocoa 中,这表明对这个主题的错误看法:-))。
<小时/>我的代码(实际上有点矫枉过正):
<小时/>添加到数组
NSMutableArray* oldParams = [paramsArray mutableCopy];
[oldParams addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:@"Parameter",@"Parameter",@"",@"Value", nil]];
[self setParamsArray:oldParams];
[paramsController setSelectionIndex:[paramsArray count]-1];
从数组中删除当前选定的对象
if ([paramsArray count]>0)
{
int s = [paramsController selectionIndex];
NSMutableArray* oldParams = [paramsArray mutableCopy];
[oldParams removeObjectAtIndex:s];
[self setParamsArray:oldParams];
if (s<=[paramsArray count]-1)
[paramsController setSelectionIndex:s];
else
[paramsController setSelectionIndex:[paramsArray count]-1];
}
那么,您对此有何看法?
最佳答案
鉴于数组 Controller 绑定(bind)到某个对象上名为 paramsArray 的属性,最好的方法是定义键值编码 indexed accessors在该对象的类上。然后,使用这些访问器以符合 KVO 的方式改变属性所表示的对多关系。
例如,实现 -insertObject:inParamsArrayAtIndex:,然后使用它来添加对象。如果您喜欢 NSMutableArray 的 -addObject: 方法的便利性,您可以编写一个 -addObjectToParamArray 方法,该方法转发到 -insertObject:inParamsArrayAtIndex:。
顺便说一句,“paramsArray”对于属性来说是一个糟糕的名称。属性名称不应编码用于实现它的类型。如果您查看索引访问器名称的模板,您会发现 Apple 希望多对多关系属性只是复数名词,如“params”(而不是“Array”)。例如,-paramsAtIndexes: 优于 -paramsArrayAtIndexes:。
关于objective-c - 添加/删除由 NSArrayController 管理的 NSMutableArray 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9995594/