Виды на основе 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 *tCell = [tableView makeViewWithIdentifier:@"MainCell" owner:self];
// Заполняем ячейки таблицы
[tCell.textField setStringValue:flags[@"imageName"]];
[tCell.imageView setImage:flags[@"image"]];
// Возвращаем готовую ячейку, иначе нихрена не делаем
return tCell;
}
return nil;
}
@end
Если все правильно сделано, должно в итоге получится во такое приложение:
В папке (к которой Мы обращаемся через код) лежат файлы типа .png. Т.е. Мы загрузили рисунок, получили имя файла, отсекли его расширение.
0 коментарі:
Отправить комментарий