Для пользователя очень важно, чтобы данные были представлены в удобном виде. В этой статье мы рассмотрим как создается табличное представление данных в OS X. Урок предназначен для тех кто уже более-менее знаком с Objective-C, и протоколами. Для начала создадим новый проект в Xcode (Cocoa). Назовем его, например, TableViewAddDataTest. Добавим на нашу форму TableView контрол. Выставим размеры согласно нашей форме (окну).
Установим количество колонок в таблице равным 1-й (Attribute Inspector -> Columns). Дальше заходим в Connections Inspector и соединяем (делаем связь) нашему аутлету dataSource и делегату delegate c AppDelegate.
А теперь о главном. "Нельзя просто так взять и добавить строчку в таблицу напрямую", проще всего и быстрее будет пакетная передача объектов таблице, что чаще в роли пакетов объектов выступают массивы, в нашем случае NSArray (для одной колонки).
И так - поехали. В наш хидер-файл AppDelegate.h добавим протокол (делегат), объявим наш массив dataArray и объект myTableView через который будем работать с таблицей и будем использовать методы NSTableView класса:
// // AppDelegate.h // TableViewAddDataTest // // Created by Brovko Roman on 18.02.14. // Copyright (c) 2014 Brovko Roman. All rights reserved. // #import <Cocoa/Cocoa.h> @interface AppDelegate : NSObject <NSApplicationDelegate, NSTableViewDataSource> { NSArray *dataArray; NSTableView *myTableView; } @property (assign) IBOutlet NSWindow *window; @endГлавное что нужно помнить при работе с табличным представлением, это - два обязательных метода, без которых в таблице не появятся данные:
// Нужно передать табличному представлению количество строк // для отображения данных, в нашем случае это колличество элементов в массиве. - (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView
// Возвращает объект (данные которые будут отображаться в строке) // для каждой строчки row нашего табличного представления - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)rowА теперь понятным языком. В первый метод мы должны передать количество объектов в нашем массиве. На основе этого в таблице будет выделена память под каждую строчку:
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { return [dataArray count]; }Следующий шаг. Мы должны передать для каждой строчки таблицы данные которые хранятся в нашем массиве. Т.е. человеческим языком индекс строки row будет равен индексу элемента нашего массива данных. В нашем случае мы передадим объекты типа NSString для каждой строки:
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { NSString *arrayString = [dataArray objectAtIndex:row]; return arrayString; }Проинициализируем наш массив (заполним его данными), т.к. пока что передавать нам в таблицу нечего (лучше всего инициализацию делать в методе init (в нашем случае), не в applicationDidFinishLaunching, при запуске массив не успеет заполнится данными и мы в таблице ничего не получим):
- (id)init { self = [super init]; if (self) { dataArray = @[@"Первая строка", @"Вторая строка", @"Третья строка", @"Четвертая строка", @"Пятая строка", @"Шестая строка"]; } return self; }Запускаем наш проект, и должно получится вот такое:
Нюанс в добавлении или удалении элементов (строк) из таблицы состоит в том чтобы вычислить выделенный объект (строку таблицы) и получить его индекс. Потом удалить/добавить объект под этим индексом из/в массива и вызвать в том же методе (в котором удаляем/добавляем объекты из массива) reloadTable. Табличное представление обновит данные из массива и покажет нужный результат:
- (void)tableViewSelectionDidChange:(NSNotification *)notification
Удачи в начинаниях. Еще один из примеров NSTableView
Немає коментарів:
Дописати коментар