添加/删除NSArrayController管理的NSMutableArray的最佳方法

时间:2012-04-03 14:41:22

标签: objective-c cocoa nsmutablearray nsmutabledictionary nsarraycontroller

我有一个NSMutableArray(包含NSMutableDictionary个实例)绑定到NSArrayControllerNSArrayController又绑定到NSTableView列)。

Cocoa最友好的方式是什么?以编程方式

  • 将新的空对象(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];
}

那么,您对此有何看法?

2 个答案:

答案 0 :(得分:2)

鉴于数组控制器绑定到某个对象上名为paramsArray的属性,最好的方法是在该对象的类上定义键值编码indexed accessors。然后,使用这些访问器以符合KVO的方式改变属性表示的to-many关系。

例如,实现-insertObject:inParamsArrayAtIndex:然后使用它来添加对象。如果您喜欢NSMutableArray&#39; s -addObject:方法的便利,您可以编写一个转发到-insertObject的-addObjectToParamArray方法:inParamsArrayAtIndex:。

顺便说一下,&#34; paramsArray&#34;是一个糟糕的财产名称。属性名称不应编码用于实现它的类型。如果你查看索引访问者名称的模板,你会发现Apple期望很多关系属性只是一个复数名词,比如&#34; params&#34; (没有&#34;数组&#34;)。例如,-paramsAtIndexes:优于-paramsArrayAtIndexes:。

答案 1 :(得分:1)

您必须将您的阵列视为控制器的后备存储,并且它正在为您管理它。

添加对象:

[[self accountsArrayController] addObject:accountDictionary];

删除当前选定的对象:

[[self accountsArrayController] remove:nil];

您必须再写一两行才能选择上一个项目,但这是我留给您的练习。