0

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

Что самое Какао и KVO- дружественный способ, программно:

  • добавляет новый пустой объект (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]; 
} 

Итак, каковы ваши мнения по этому поводу?

ответ

1

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

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

[[self accountsArrayController] addObject:accountDictionary]; 

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

[[self accountsArrayController] remove:nil]; 

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

+0

Я получаю «Программный сигнал:« EXC_BAD_ACCESS »' в обоих случаях ... Любые идеи? –

+0

@ Dr.Kameleon: Возможно. Убедитесь, что любое предыдущее использование контроллера массива не включает использование 'setContent:' (хотя я обнаружил, что использование привязок для этого в самом начале работает просто отлично). И само собой разумеется, что ваш поддерживающий массив должен быть допустимым, распределенным «NSMutableArray». – trudyscousin

+0

Мой массив подставки отлично работает. Дело в том, что я могу делать ЛЮБОЙ вид обработки непосредственно в массиве, но ваш подход (с использованием контроллера напрямую для обработки массива) никогда не работал для меня ... –

2

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

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

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