Отображение изображений Используя привязку
Вы обычно изображения на дисплее с помощью или NSImageCell или NSImageView. Вы могли бы изображения на дисплее в столбцах таблицы в основном интерфейсе или представлении изображения в подробном интерфейсе. Оба из этих компонентов имеют подобную привязку и поэтому оба обсуждены в этой статье. При использовании этих компонентов также необходимо принять подобные решения относительно того, как Вы хотите сохранить и получить доступ к Вашим изображениям. Привязка значения этих компонентов поддерживает множество форматов. Можно указать привязку значения с помощью NSImage, пути к файлу или URL.
Примером, представленным в этой статье, является расширение тех в Создании Интерфейса Основной Подробности. В частности эта статья объясняет, как добавить NSImageCell к столбцу таблицы в основном интерфейсе (показанный на рисунке 1) и NSImageView к подробному интерфейсу. Эта статья также содержит пример пользовательского преобразователя значения, преобразовывающего имена файла образа в абсолютные пути.
Посмотрите Создание Интерфейса Основной Подробности для шагов для создания основного интерфейса основной подробности.
Создание моделей
То, как Вы определяете свойства изображения в своих моделях, зависит от Вашего приложения — оно зависит от того, как Вы хотите сохранить и получить доступ к изображениям. Если изображения сохранены на диске или в Вашей папке проекта на том же компьютере, то можно получить доступ к ним через путь к файлу. Если изображения сохранены не на диске, а на удаленном сервере, то можно получить доступ к ним через URL. Если изображения сохранены в некотором источнике данных, то Вы могли бы загрузить изображения непосредственно в память. При загрузке их Вы могли бы определить свои свойства изображения как просто объекты NSImage. К счастью, привязка Какао поддерживает все эти опции.
В этом примере модель использует NSImage для представления image
свойство Мультимедийного объекта как показано на рисунке 2 в Создании Интерфейса Основной Подробности.
В случае пути к файлу или URL, Вы обычно храните только имя файла в модели не абсолютный путь или URL (например, Вы не хотите обновлять свои модели каждый раз, когда Вы перемещаете папку изображения). Однако привязка ожидает абсолютный путь или URL. Одно решение состоит в том, чтобы реализовать пользовательский преобразователь значения, берущий имя файла образа и возвращающий путь к файлу или URL на основе некоторых переменных, которые Вы определяете. Посмотрите Используя Преобразователь Значения для Преобразования Путей для изменения этого примера для использования путей к файлам вместо объектов NSImage.
Создание представлений
Затем, Вы создаете представления изображения или перетаскиванием NSImageView к окну или NSImageCell к столбцу, который выведет на экран изображения.
Создание контроллеров
Этот пример предполагает, что у Вас уже есть рабочий интерфейс основной подробности. Выполните шаги в Создании Контроллеров в Создании Интерфейса Основной Подробности, если необходимо создать контроллер массива.
Привязка представлений к контроллерам
Затем, Вы связываете представления изображения с контроллерами. Подмножество привязки значения NSImageView и NSTableColumn (содержащий NSImageCell) для выбора из:
value
— объект NSImage.valuePath
— абсолютный путь к файлу образа.valueURL
— URL, возвращающий файл образа.
Например, Вы конфигурируете value
привязка для столбца таблицы Изображения на рисунке 1 следующим образом:
Набор
Bind to
к Вашему объекту контроллера массива. Например,MediaAssetsController
.Набор
Controller Key
кarrangedObjects
(набор выводимых на экран объектов).Набор
Model Key Path
к свойству NSImage для отображения в том столбце. Например, в приложении актива носителей, устанавливает ключевой путь кimage
.
Вы конфигурируете value
привязка для NSImageView в подробности взаимодействует через интерфейс точно так же за исключением того, что Вы устанавливаете Controller Key
значение к selection
(т.е. в настоящее время выбранный объект).
Посмотрите Используя Преобразователь Значения для Преобразования Путей для изменения этого примера, использующего valuePath
привязка.
Используя преобразователь значения для преобразования путей
Если Вы хотите получить доступ к своим изображениям с помощью пути к файлу, то Вы связываете свои представления с Вашими контроллерами с помощью valuePath
привязка вместо этого. Однако valuePath
как ожидают, будет абсолютным путем к файлу. Как правило, Вы не храните абсолютные пути в своих моделях, просто имена файлов или относительные пути. Можно преобразовать имя файла или относительный путь к абсолютному пути с помощью пользовательского преобразователя значения следующим образом.
Создание пользовательских преобразователей значения
Сначала создайте пользовательский преобразователь значения, берущий имя файла или относительный путь и преобразовывающий его в абсолютный путь. Вы делаете это путем разделения на подклассы NSValueTransformer и переопределения transformedValueClass
и allowsReverseTransformation
методы класса, как показано в Перечислении 1.
Вы реализуете transformedValue:
метод для выполнения трансформации. Например, transformedValue:
реализация метода в Перечислении 1 предполагает, что изображения расположены в проекте Resources
папка и NSBundle’s использования resourcePath:
метод для преобразования имени файла в абсолютный путь. Обратите внимание на то, что необходимо изменить этот пример при хранении изображений где-то в другом месте в файловой системе.
Перечисление 1 файл реализации PathTransformer
#import "PathTransformer.h" |
@implementation PathTransformer |
+ (Class)transformedValueClass |
{ |
return [NSString self]; |
} |
+ (BOOL)allowsReverseTransformation |
{ |
return NO; |
} |
- (id)transformedValue:(id)beforeObject |
{ |
if (beforeObject == nil) return nil; |
id resourcePath = [[NSBundle mainBundle] resourcePath]; |
return [resourcePath stringByAppendingPathComponent:beforeObject]; |
} |
@end |
Регистрация преобразователей значения
Для использования пользовательского преобразователя значения необходимо сначала зарегистрировать его в NSValueTransformer. Обратите внимание на то, что Вы регистрируете экземпляры преобразователя значения, не подкласс. Вы обычно регистрируете преобразователи значения в initialize
метод или делегат приложения applicationDidFinishLaunching:
метод. При регистрации преобразователя значения Вы даете ему логическое имя, которое можно использовать позже при конфигурировании привязки. Например, добавьте следующий фрагмент кода к applicationDidFinishLaunching:
зарегистрировать вызванный экземпляр PathTransformer
:
id transformer = [[[PathTransformer alloc] init] autorelease]; |
[NSValueTransformer setValueTransformer:transformer forName:@"PathTransformer"]; |
Привязка представлений к контроллерам Используя преобразователи
Наконец, Вы указываете преобразователь значения при привязке представлений с контроллерами с помощью valuePath
привязка. Например, Вы конфигурируете valuePath
привязка для столбца таблицы Изображения следующим образом:
Установите
Bind to
аспект к Вашему объекту контроллера массива — например,MediaAssetsController
.Установите
Controller Key
аспект кarrangedObjects
(набор выводимых на экран объектов).Установите
Model Key Path
аспект к свойству, содержащему имя файла образа. Например, в приложении актива носителей, устанавливает ключевой путь кimagePath
.Введите логическое имя преобразователя,
PathTransformer
, в текстовом поле Value Transformer.
Рисунок 2 показывает область Bindings NSTableColumn в Интерфейсном Разработчике с valuePath
привязка показала и сконфигурировала для использования пользовательского преобразователя значения.
Использовать valueURL
при привязке вместо этого, реализуйте подобный преобразователь значения для преобразования имен файлов или относительных путей к надлежащему объекту NSURL. Дополнительно, можно улучшить класс PathTransformer для обработки других типов трансформаций имени файла. В последнем случае зарегистрируйте различные экземпляры с помощью различных имен (например, PathTransformer
и URLTransformer
) обработать каждый тип трансформации.