Главная » iPhone, Objective-C, Программирование для iOS и MacOS » Связывание табличного  представления iTahDoodle

0

Табличное представление отображается на экране, но оно понятия не имеет, какие данные в нем должны выводиться. Табличное представление, будучи объектом представления, не располагает никакой информацией о своих данных. Ему нужен объект, который будет использоваться в качестве источника данных. В iТahDoodle источником данных табличного представления будет экземпляр BNRAppDelegate.

В файле BNRAppDelegate.m измените метод application: didFinishLaunchingWithOptions: так, чтобы он отправлял табличному представлению сообщение, назначающее экземпляр BNRAppDelegate его источником данных:

// Создание и настройка табличного представления taskTable = [[UITableView alloc] initWithFrame:tableFrame

style:UITableViewStylePlain]; [taskTable setSeparatorStyle:UITableViewCellSeparatorStyleNone];

// Назначение текущего объекта источником данных табличного представления [taskTable setDataSource:self];

// Создание и настройка текстового поля для ввода новых задач taskField = [[UITextField alloc] initWithFrame:fieldFrame];

Чтобы источник данных табличного представления выполнял свою работу, он должен реализовать методы протокола UIТаblеViеwDаtаSоurсе. Сначала следует объявить о поддержке этого протокола BNRAppDelegate в файле BNRAppDelegate.h:

@interface BNRAppDelegate : UIResponder

<UIApplicationDelegate, UITableViewDataSource>

{

UITableView *taskTable; UITextField *taskField; UIButton *insertButton; NSMutableArray *tasks;

}

-­‐        (void)addTask:(id)sender;

Протокол UITableViewDataSource содержит два обязательных метода, которые должны быть реализованы классом BNRAppDelegate. Как минимум источник данных табличного представления должен быть способен сообщить табличному представлению, сколько строк содержит заданная секция таблицы и что должно отображаться в ячейке заданной строки. Реализуйте методы соответствующим образом:

#pragma mark -­‐  Table View management

-­‐   (NSInteger)tableView:(UITableView  *)tableView numberOfRowsInSection:(NSInteger)section

{

// так как данное табличное представление содержит только одну

// секцию, количество строк в ней равно количеству элементов

// массива tasks

return [tasks count];

}

-­‐   (UITableViewCell  *)tableView:(UITableView  *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath

{

// для улучшения быстродействия мы заново используем

// ячейки, вышедшие за пределы экрана, и возвращаем их

// с новым содержимым вместо того, чтобы всегда создавать

// новые ячейки. Сначала мы проверяем, имеется ли ячейка,

// доступная для повторного использования.

UITableViewCell *c = [taskTable dequeueReusableCellWithIdentifier:@"Cell"];

if (!c) {

// .. и создаем новую ячейку только в том случае,

// если доступных ячеек нет.

c = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];

}

// Затем ячейка настраивается в соответствии с информацией

// объекта модели (в нашем случае это массив todoItems) NSString *item = [tasks objectAtIndex:[indexPath row]]; [[c textLabel] setText:item];

// and hand back to the table view the properly configured cell

return c; }

Рис. 27.8, Полная диаграмма объектов iTahDoodle

Чтобы протестировать приложение, добавьте данные прямо в массив в начале

application:didFinishLaunchingWithOptions:.

-­‐   (BOOL)application:(UIApplication  *)application didFinishLaunchingWithOptions:(NSDictionary      *)launchOptions

{

// Попытка загрузки существующего списка задач

// из массива , хранящегося на диске.

NSArray *plist = [NSArray arrayWithContentsOfFile:docPath()]; if (plist) {

// Если набор данных существует, он копируется

// в переменную экземпляра.

tasks = [plist mutableCopy];

} else {

// в противном случае просто создаем пустой исходный набор. tasks = [[NSMutableArray alloc] init];

}

// массив tasks пуст?

if ([tasks count] == 0) {

// Put some strings in it

[tasks addObject:@"Walk the dogs"]; [tasks addObject:@"Feed the hogs"]; [tasks addObject:@"Chop the logs"];

}

// создание и настройка экземпляра UIWindow

CGRect windowFrame = [[UIScreen mainScreen] bounds];

UIWindow *theWindow = [[UIWindow alloc] initWithFrame:windowFrame]; [self setWindow:theWindow];

}

Постройте  и  запустите  приложение.  В  табличном  представлении  должны

отображаться тестовые данные, но новые задачи по-прежнему не добавляются. За дело!

Источник: Аарон Хилегас, «Objective-C. Программирование для iOS и MacOS», 2012 г.

По теме:

  • Комментарии