Какао: настраиваемый ключ контроллера для NSArrayController

Можно ли создать настраиваемый ключ контроллера для NSArrayController? Есть ключи для «аранжированных объектов», «выделения» и т. Д. Можно ли реализовать свои собственные? Кажется, я нигде не могу найти никакой информации об этом.

Моя причина, по которой я хочу это сделать (кроме того, что это кажется полезной вещью, которую можно сделать):

У меня есть сущность «Автомобиль» с атрибутами «цвет» и «пробег» и контроллер массива «CarArrayController», который хранит эти объекты и отображает их в таблице. Под таблицей мне нужны два текстовых поля: одно отображает общий пробег красной машины, а другое - общий пробег синей машины. Очевидно, я могу отобразить общее количество автомобилей: привязать значение к «CarArrangedController.arrangedObjects. @ Sum.m900», но до сих пор мне не удавалось получить отдельные суммы для красных и синих автомобилей без реализации дополнительных массивов или контроллеров массивов.

Если бы я мог создать ключ контроллера «arrangedRedCarObjects», который, очевидно, возвращал бы только красные автомобили, я мог бы иметь привязку к: «CarArrangedController.arrangedRedCarObjects. @ Sum.m900».

Кажется, я не могу найти способ достичь своей цели :(

Должен быть способ получить нужный мне результат (это похоже на общую проблему), пожалуйста, помогите!

Ваше здоровье,

Оли


person Community    schedule 15.09.2010    source источник


Ответы (2)


Ключи контроллера - это больше, чем просто строки: это методы NSArrayController, каждый из которых проходит некоторую логику, создает объект и возвращает этот объект. Вы не можете просто добавлять ключи, потому что за ключом не будет никакой логики.

Итак, если вы не хотите создавать больше контроллеров массива, вам нужно сделать более мощный контроллер массива. Создайте подкласс NSArrayController, который реализует методы для ключей, которые вы хотите, и в этих методах спросите себя об исходном массиве (например, arrangedObjects), выполните любые ограничения и перестановки, которые вы хотите, и верните этот результат.

Не забудьте объявить ваши новые методы зависимыми от их исходных свойств (например, arrangedRedCarObjects как зависимые от arrangedObjects). Это еще одна вещь, которую нельзя выполнить простым добавлением ключей в список: он не будет знать, от каких исходных свойств / свойств должен зависеть ваш новый ключ.

person Peter Hosey    schedule 15.09.2010
comment
Это во многом поможет мне понять мою проблему, спасибо! Я могу создать подкласс NSArrayController, чтобы предоставить дополнительные методы, которые возвращают отфильтрованные части массива (я также могу сделать это с помощью Catagories, чтобы добавить методы в класс NSArrayController). Но как мне тогда привязаться к этим методам? то есть могу я как-то связать текстовое поле с blueCarFilteringMethod. @ sum.milegae ?? - person ; 15.09.2010
comment
Чарли: Ага. Как я уже сказал, клавиши контроллера - это методы. Если вы добавляете метод и делаете его наблюдаемым (например, делая его зависимым от существующего ключа), вы добавляете ключ и привязываетесь к нему так же, как один из стандартных ключей. (Не включайте его в путь ключа модели.) - person Peter Hosey; 15.09.2010
comment
ах, ладно, может быть, я не делаю свои новые методы наблюдаемыми. Я пытался привязаться к ним так же, как с использованием стандартных ключей, т.е. Я постараюсь сделать их наблюдаемыми (как?) И вернусь к вам. Спасибо за помощь - person ; 15.09.2010
comment
Чарли: Я сказал вам как в ответе, так и в моем комментарии. Что значит «приложение не запускалось»? - person Peter Hosey; 15.09.2010
comment
У меня есть подкласс NSArrayController с методом, который предоставляет только синие автомобили. Я не думаю, что сейчас это можно наблюдать. Когда я нажимаю «Сборка и переход», я получаю сообщение об ошибке: [‹NSCFArray 0x1918e0› addObserver: forKeyPath: options: context:] не поддерживается. Ключевой путь: @ сумма. Пробег. Как мне сделать мой метод зависимым от существующего ключа (например, аранжированных объектов (я полагаю, это то, что вы имеете в виду?))? - person ; 15.09.2010
comment
developer.apple.com/mac/library/documentation/Cocoa/Conceptual / отвечает на этот вопрос, но в этом исключении это не поможет. Вы не можете наблюдать свойство массива, поскольку у него нет способа выразить, для каких объектов это свойство изменилось; вы должны наблюдать через контроллер. Если то, что у вас есть, работает, когда вы меняете arrangedBlueCarObjects на arrangedObjects, то я не уверен, как это преодолеть. - person Peter Hosey; 16.09.2010
comment
Если вы могли бы предоставить какой-то пример кода, я действительно изо всех сил пытаюсь заставить это работать. Я могу закодировать метод для возврата отфильтрованного массива: return [[самоорганизованные объекты] filterArrayUsingPredicate: bluePredicate]; Но я не могу понять, как выполнить привязку к методу или результату, а также к любым другим методам, которые необходимо реализовать для KVO и т. Д. - person ; 16.09.2010
comment
Вы должны привязаться к этому новому свойству с помощью Interface Builder - как я уже сказал, вы должны иметь возможность переключаться между arrangedBlueCarObjects и arrangedObjects для ключа контроллера, и он будет работать в любом случае. Попробуйте последнее и убедитесь, что это работает. Вам не нужно ничего реализовывать, кроме зависимости. - person Peter Hosey; 16.09.2010
comment
Хорошо, я прочитал эту документацию по KVO и добавил код, чтобы гарантировать регистры объектов для KVO, но у меня все еще возникают трудности - это не работает, и я не понимаю, почему нет, и я даже не знаю, возможно ли то, что я хочу сделать, потому что я нигде не видел такого примера. Во всяком случае, вы можете увидеть мою попытку здесь: stackoverflow.com/questions/3728308/ и скажите мне, где я ошибаюсь! - person ; 16.09.2010

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

person Peter Hosey    schedule 15.09.2010
comment
Я уже пробовал это, и это работает. Но мне нужен способ решить проблему без создания нового массива (контроллера) для каждого цвета автомобиля. Должен быть способ добавить собственные ключи контроллера ?! Конечно??? - person ; 15.09.2010