|
Июл
12
|
Метод по умолчанию “UITableViewCell” позволяет отображать текст (с текстовым свойством) или изображение (со свойством изображения). А вот вывести данные в нескольких столбцах или строках не получится. В шестом уроке серии, посвященной “UITableView“, мы воспользуемся кодом предыдущего урока. Вот как будет в итоге выглядеть приложение:

Простым указанием текстового свойства для “UITableViewCell” такого результата не добиться. Чтобы решить проблему, добавим к представлению содержимого ячейки две метки. Указав соответствующие координаты, сделаем так, чтобы они выводились одна над другой. Согласно документации Apple, чтобы не менять поведения ячейки по умолчанию, объекты “subview” необходимо добавлять к представлению содержимого ячейки. Соответственно, мы не будет наследовать “UITableViewCell“.
Добавление объектов “subview”
Вместо того чтобы создавать ячейку с помощью “initWithFrame:reuseIdentifier“, воспользуемся собственным методом, который будет отвечать не только за создание ячейки, но и за метки. С помощью координат x и y метки добавляются в определенное место в ячейке. Показанный ниже код вносит их в представление содержимого ячейки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | //файл "RootViewController.h" #import <UIKit/UIKit.h></span> @class OverlayViewController; @interface RootViewController : UITableViewController { NSMutableArray *listOfItems; NSMutableArray *copyListOfItems; IBOutlet UISearchBar *searchBar; BOOL searching; BOOL letUserSelectRow; OverlayViewController *ovController; } - (UITableViewCell *) getCellContentView:(NSString *)cellIdentifier; - (void) searchTableView; - (void) doneSearching_Clicked:(id)sender; @end //RootViewController.m - (UITableViewCell *) getCellContentView:(NSString *)cellIdentifier { CGRect CellFrame = CGRectMake(0, 0, 300, 60); CGRect Label1Frame = CGRectMake(10, 10, 290, 25); CGRect Label2Frame = CGRectMake(10, 33, 290, 25); UILabel *lblTemp; UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:CellFrame reuseIdentifier:cellIdentifier] autorelease]; //Инициализация метки с тегом 1. lblTemp = [[UILabel alloc] initWithFrame:Label1Frame]; lblTemp.tag = 1; [cell.contentView addSubview:lblTemp]; [lblTemp release]; //Инициализация метки с тегом 2. lblTemp = [[UILabel alloc] initWithFrame:Label2Frame]; lblTemp.tag = 2; lblTemp.font = [UIFont boldSystemFontOfSize:12]; lblTemp.textColor = [UIColor lightGrayColor]; [cell.contentView addSubview:lblTemp]; [lblTemp release]; return cell; } |
Представленный выше метод создает три прямоугольника — для ячейки и для двух меток в ней. Саму ячейку мы получаем посредством “initWithFrame:reuseIdentifier“, но в этот раз к свойству представления содержимого добавляем две метки. Инициализируем первую метку с помощью координат “Label1Frame” — метка будет отображаться в верхней части ячейки. Чтобы отыскать метку в методе “tableView:cellForRowAtIndexPath“, тег для нее устанавливаем на 1. Теперь инициализируем вторую метку посредством координат “Label2″Frame” (метка выводится в нижней части ячейки). Задаем для нее тег 2. К представлению содержимого ячейки метки добавляются методом “addSubView“. Последним шагом возвращаем ячейку для последующего использования.
Отображение данных
Имея ячейку табличного представления, можем получить нижележащую метку, передав ячейке сообщение “viewWithTag“. Данные установлены на текстовое свойство метки, а не ячейки. Вот как изменится код для “tableView:cellForRowAtIndexPath“:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | //файл "RootViewController.m" - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {</span> static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if(cell == nil) cell = [self getCellContentView:CellIdentifier]; UILabel *lblTemp1 = (UILabel *)[cell viewWithTag:1]; UILabel *lblTemp2 = (UILabel *)[cell viewWithTag:2]; if(searching) { lblTemp1.text = [copyListOfItems objectAtIndex:indexPath.row]; lblTemp2.text = @""; } else { //Сначала получаем объект-словарь NSDictionary *dictionary = [listOfItems objectAtIndex:indexPath.section]; NSArray *array = [dictionary objectForKey:@"Countries"]; NSString *cellValue = [array objectAtIndex:indexPath.row]; lblTemp1.text = cellValue; lblTemp2.text = @"Sub Value"; [cellValue release]; } return cell; } |
Если теперь запустить приложение, сразу бросятся в глаза проблемы с отображением данных, которые решаемы указанием высоты строки. Это делается в методе “tableView:heightForRowAtIndexPath“:
1 2 3 4 5 | //файл "RootViewController.m" -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {</span> return 60; } |
Все строки в табличном представлении получат высоту 60. Запустите приложение, и посмотрите, что изменилось.
Заключение
В этом уроке мы убедились, насколько легко настраивается ячейка табличного представления. Тот же принцип настройки отображаемой информации применим к представлению наполнения — с помощью опций контроля. Вместо меток можно предусмотреть, например, индикатор хода задания.


Последние комментарии
Подскажите пожалуйста… Вот...
Код не открывает страницы по простой причине -...