Какао - отображение вложенных массивов в табличном представлении - PullRequest
0 голосов
/ 28 ноября 2011

У меня есть контроллер дерева, связанный с массивом, называемым «контентом». «content» - это массив объектов модели, называемый «Car». Каждый «Car» содержит NSString с именем «carName» и NSMutableArray с названием «mostPopularColors». «mostPopularColors» содержит объекты NSMutableDictionary с ключами, такими как: «самый популярный», «второй по популярности», «третий по популярности» и т. д., и значениями, такими как «красный», «зеленый», «синий» и т. д.

Представление структуры привязано к упорядоченным объектам контроллера дерева и отображает «carName» каждого «Car» в «content». Отдельное табличное представление перечисляет каждое "carName" в одном столбце. Это достигается путем привязки контроллера массива к контроллеру дерева (ключ контроллера: выбор, путь ключа модели: allChildLeafs). Затем значение столбца таблицы привязывается к упорядоченным объектам контроллера массива, путь ключа модели: carName.

В табличном представлении мне нужны два других столбца, в которых перечислены наиболее популярные цвета и вторые по популярности цвета соответственно. Таким образом, в финальной таблице должно быть три столбца, в которых перечислены все названия автомобилей, а также два самых популярных цвета каждого автомобиля.

Я могу получить доступ к названиям автомобилей, как описано, но не к цветам, поскольку они сами находятся в массивах.

Я попытался создать второй контроллер массива и связать его с первым, но не могу заставить его работать.

Итак, в конце я хочу иметь возможность выбрать автомобиль или автомобили в виде контура и увидеть все их названия и два верхних цвета каждого в виде таблицы.

1 Ответ

0 голосов
/ 04 декабря 2011

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

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

В Xcode был создан NSOrayController IBOutlet, а затем подключен к вновь созданному контроллеру массива в Интерфейсном Разработчике (IB).Также был объявлен новый NSMutableArray с методами установки и получения.Затем для связывания контроллера массива с новым NSMutableArray использовался следующий код:

[newArrayController bind:NSContentArrayBinding toObject:self withKeyPath:@"mutableArray" options:nil];

Так что теперь контроллер массива будет «держать» все, что было в новом изменяемом массиве.Содержимое массива можно отобразить в табличном представлении, подключив новый контроллер массива к табличному представлению.

Все, что нужно было сделать, чтобы этот изменяемый массив содержал объект NSMutableDictionary для каждой машины.Каждый словарь будет иметь три пары ключ-значение.Вот три ключа: «carName», «mostPopularColor», «secondMostPopularColor».

Поскольку старый контроллер массива содержал массив объектов «Car», выбранных в данный момент в виде структуры, это было сделано путем первого полученияэтот массив "автомобилей" объектов.Чтобы сделать это, наблюдались изменения в упорядоченных объектах старого контроллера массива, и новый массив объектов "Car" наблюдался с использованием:

[oldArrayController addObserver:self forKeyPath:@"arrangedObjects" options:NSKeyValueObservingOptionNew context:nil];

Для обработки наблюдения и использования нового массива объектов "Car" дляполучить окончательный массив объектов словаря был реализован следующий метод:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context  {if (object == selectedChildLeafsController)
{
    if ([[object arrangedObjects] count] > 0)
    {//make a new mutable array, here called "array", of dictionaries from your array of "Car" objects which is found in [object arrangedObjects] . And then something like...
    [self setMutableArray: array];
    [newArrayController bind:NSContentArrayBinding toObject:self withKeyPath:@"selectedBonds" options:nil];}else
{
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}}
...