неділя, 23 лютого 2014 р.

Урок по работе с NSTableVIew. Добавление данных

Для пользователя очень важно, чтобы данные были представлены в удобном виде. В этой статье мы рассмотрим как создается табличное представление данных в 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

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments