objective-c - 添加/删除由 NSArrayController 管理的 NSMutableArray 的最佳方法

标签 objective-c cocoa nsmutablearray nsmutabledictionary nsarraycontroller

我有一个 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/

相关文章:

iphone - 在 iPhone 的 Objective-C 中的 (commitEditingStyle) 之外调用 (deleteRowsAtIndexPaths)

swift - 使用谓词搜索对象的 NSMutableArray

objective-c - NSAlert 中的 NSTextView 没有滚动条

macos - NSGridView 在 Storyboard中不可用?

swift - 如何在 NSAlert 模态对话框的标题栏中设置文本

iphone - 替换对象索引 :withObject: not working when passing in a NSString object

ios - 从 NSMutableArray 中删除随机项

objective-c - Cocoa 中的垃圾收集问题

iphone - 验证电话提示后是否进行了调用

ios - 优化 NSRegularExpression 性能