Лучший способ добавить / удалить NSMutableArray, управляемый NSArrayController - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть NSMutableArray (содержащий NSMutableDictionary экземпляров), связанный с NSArrayController (NSArrayController в свою очередь связан с NSTableView столбцами).

Что является наиболее подходящим для какао и КВО способом, программно :

  • добавить новый пустой объект (NSMutableDictionary) в массив?
  • удаление выбранного в данный момент объекта? (после удаления следует выбрать предыдущий элемент, если он существует)

Я всегда делал это таким образом, который мне не особенно нравится - и я уверен, что это не лучший способ (слишком много строк кода для чего-то такого простого: в Какао, которое указывает на неправильно беру по теме: -)).


Мой код (на самом деле довольно излишне):


Добавление в массив

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 ]

2 голосов
/ 04 апреля 2012

Учитывая, что контроллер массива привязан к свойству paramsArray для какого-либо объекта, наилучшим подходом является определение кодирования значения ключа индексированных методов доступа для класса этого объекта.Затем используйте эти методы доступа, чтобы изменить отношение «ко-многим», представленное свойством, в KVO-совместимом виде.

Например, реализовать -insertObject: inParamsArrayAtIndex: и затем использовать его для добавления объекта.Если вам нравится удобство NSMutableArray -addObject: метод, вы можете написать метод -addObjectToParamArray, который перенаправляет в -insertObject: inParamsArrayAtIndex:.

Кстати, «paramsArray» - плохое имя для свойства.Имя свойства не должно кодировать тип, используемый для его реализации.Если вы посмотрите на шаблоны для индексированных имен средств доступа, то увидите, что Apple ожидает, что многие свойства отношений будут просто существительным во множественном числе, например «params» (без «Array»).Например, -paramsAtIndexes: лучше, чем -paramsArrayAtIndexes:.

1 голос
/ 03 апреля 2012

Вы должны думать о своем массиве как о резервном хранилище контроллера и о том, что он управляет им для вас.

Добавление объекта:

[[self accountsArrayController] addObject:accountDictionary];

Удаление выбранного в данный момент объекта:

[[self accountsArrayController] remove:nil];

Вам придется написать еще одну или две строки, чтобы выбрать предыдущий элемент, но я оставлю вам это упражнение.

...