Виды на основе view-based таблицы, обеспечивают богатые возможности во время проектирования. Сам по себе NSTableCellView отображает ImageView и textField. Но отличающейся особенностью этого рода view-based ячеек от cell-based ячеек, является размещение в ячейке разных видов компонентов интерфейса.
Итак, начнем. Создадим новый проект в Xcode. Добавим на форму NSTableView. Выберем нашу таблицу NSTableView (Помните, что таблица сама по себе состоит из набора компонентов - NSScrollView -> NSClipView -> NSTableView-> NSTableColumn -> NSCell). И в Инспекторе Атрибутов в секции Table View -> Content Mode, вместо Cell Based выберем View Based. Выставим количество колонок равным 1-й. Удалим в таблице строчку Text View или Text, и вместо этой строчки добавим View-based строчку (В наборе компонентов интерфейса находим Image & Text Table Cell View, и перетаскиваем в нашу таблицу). Выделяем вставленную строку и в Size Inspector устанавливаем высоту строки равным 50px. Далее выбираем иконку в нашей ячейке и в Инспекторе Атрибутов в секции Image Cell -> Image наберем NSApplicationIcon (Вы можете растянуть иконку как Вам угодно, и скомпоновать с текстовой строкой в разных положениях в пределах View-строки). Напоследок выделяем NSTableColumn, и в Identity Inspector -> Identity -> Identifier пропишем идентификатор колонки "MainCell". По этому идентификатору будем обращаться к колонке не по ее ID, а по ее имени, что естественно проще запомнить. Должно получится что-то вроде этого:
Опять выделим NSTableView. Перейдем в Connections Inspector и свяжем dataSource и delegate с App Delegate - объектом.
Суть задачи состоит в том, чтобы из стандартного приложения iChat вытянуть флаги стран - собеседников и вывести их в таблицу отобразив иконку флага и название страны.
В AppDelegate.h добавляем делегаты NSTableViewDataSource и NSTableViewDelegate, потому что Мы будем использовать методы делегатов для работы с таблицами. Основные методы, без которых не будет работать таблица описаны в статье Урок по NSTableView.
@interface AppDelegate : NSObject <NSApplicationDelegate, NSTableViewDataSource, NSTableViewDelegate>
Открываем AppDelegate.m и пишем код (код с пояснениями):
#import "AppDelegate.h" @implementation AppDelegate { NSMutableArray *tableContents; } - (void)awakeFromNib { tableContents = [[NSMutableArray alloc] init]; // Устанавливаем путь к файлам - флагам NSString *pathFlags = @"/Library/Application Support/Apple/iChat Icons/Flags"; // Инициализируем файл - менеджер для работы с файлами NSFileManager *filesOfFlags = [NSFileManager defaultManager]; // Получает список поддиректорий директории или список файлов NSDirectoryEnumerator *dEnumerator = [filesOfFlags enumeratorAtPath:pathFlags]; // Переменная в которой будет хранится каждый файл NSString *file; // Проходим в цикле по всем файлам и добавляем созданные объекты в массив while (file = [dEnumerator nextObject]) { // Получаем полное имя файла с расширением NSString *filePath = [pathFlags stringByAppendingFormat:@"/%@", file]; // Вытягиваем рисунок с файла и имя файла без расширения // Инициализируем для каждого изображения и имени ключи по которым будем обращаться // к компонентам объекта NSDictionary *dictObj = @{@"image": [[NSImage alloc] initByReferencingFile:filePath], @"imageName": [file stringByDeletingPathExtension]}; // Добавляем объект словаря в массив [tableContents addObject:dictObj]; } } - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { // Возвращаем количество строк в массиве для выделения количества строк в таблице return [tableContents count]; } - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { // Получаем входящую строку row (ее индекс) NSDictionary *flags = tableContents [row]; // Определяем идентификатор таблицы (MainCell) NSString *colID = [tableColumn identifier]; if ([colID isEqualToString:@"MainCell"]) { // Получить ячейку с идентификатором MainCell если она существует NSTableCellView *cell = [tableView makeViewWithIdentifier:@"MainCell" owner:self]; // Заполняем ячейки таблицы [cell.textField setStringValue:flags[@"imageName"]]; [cell.imageView setImage:flags[@"image"]]; // Возвращаем готовую ячейку, иначе ничего не делаем return cell; } return nil; } @end
Если все правильно сделано, должно в итоге получится во такое приложение:
В папке (к которой мы обращаемся через код) лежат файлы типа .png. Т.е. мы загрузили рисунок, получили имя файла, отсекли его расширение.
Немає коментарів:
Дописати коментар