ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C часть 2

Более подробно о ячейках

В предыдущем примере мы подробно рассматривали возможности таблицы, но о ячейках ничего не было сказано. Этот пример поправит ситуацию.

 

 

Для чистоты эксперимента я предлагаю взять код с примера, где мы впервые познакомились с таблицами.

 

В первую очередь хочу обратить внимание на два состояния чейки. Изначально у всех ячеек состояние не выбранных, но когда вы нажмете на одну из них — она становится выбранной (синей). За такое поведение ячейки отвечает ее атрибут selected, он может принимать два значения YES или NO. В первую очередь хочу обратить внимание на то, что у нас есть возможность изменять цвет бранной ячейки. Для этого нам нужно изменить значение атрибута selectionStyle. Всего этот атрибут принимает три значения:

 

  • UITableViewCellSelectionStyleNone
  • UITableViewCellSelectionStyleBlue (по умолчанию)
  • UITableViewCellSelectionStyleGray

 

Следует обратить внимание на тот факт, что значение атрибута selectionStyle мы будем устанавливать один раз (оно не будет зависеть от действий пользователя), а значит и делать это нужно тоже один раз (в момент создания ячейки, то есть в методе cellForRowAtIndexPath).

 

<code data-result="[object Object]">- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        //Создание ячейки
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                       reuseIdentifier:CellIdentifier] autorelease];
        //Изменение стиля нажатия ячейки
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }

    cell.textLabel.text = [students objectAtIndex:indexPath.row];

    return cell;
}</code>

 

Наверное не один я заметил, что не нормальным является поведение, когда ячейка остается нажатой. Это связанно с тем, что при нажатии атрибуту ячейки selected устанавливается значение YES, а в обработке нажатия — мы не изменяем значение этого атрибута. Давайте исправим эту ситуацию. didSelectRowAtIndexPath — это метод, который вызывается после нажатия на ячейку таблицы. Он уже содержит закомментированный код к которому мы вернемся позже, но в этом примере он не нужен. Давайте его заменим следующим кодом:

 

<code data-result="[object Object]">- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row &lt; 2) {
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

        if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
            cell.accessoryType = UITableViewCellAccessoryNone;
        } else {
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        }
    }

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}</code>

 

В первую очередь мы проверяем, установлено ли у первых двух ячеек данному атрибуту значение UITableViewCellAccessoryCheckmark, если да — тогда убираем его, а если не установлено — устанавливаем. Таким образом я организовал возможность множественного выбора в нашей таблице. Последней строчкой я с использованием анимации снимаю выделение выбранной ячейки.

 

Попробуйте как это работает. Всего атрибут accessoryType может принимать четыре значения:

 

  • UITableViewCellAccessoryNone (по умолчанию)
  • UITableViewCellAccessoryDisclosureIndicator
  • UITableViewCellAccessoryDetailDisclosureButton
  • UITableViewCellAccessoryCheckmark

 

Первое и последнее значение этого атрибута может меняться в зависимости от действий пользователя, тогда как UITableViewCellAccessoryDisclosureIndicator и UITableViewCellAccessoryDetailDisclosureButton остаются постоянным, а значит устанавливать их следует в момент создания ячейки:

 

<code data-result="[object Object]">if (indexPath.row == 2) {
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
} else if (indexPath.row == 3) {
    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
}</code>

 

Здесь я установил вышеупомянутые атрибуты для третьей и четвертой ячеек. Вот как выглядит теперь наша таблица:

 

 

Теперь хочу обратить ваше внимание на ту часть кода, где мы создаем ячейку. Для этого мы используем метод initWithStyle, первым из параметров которого является стиль ячейки. Ниже я привел все возможные стили.

 

  • UITableViewCellStyleDefault (по умолчанию)
  • UITableViewCellStyleValue1
  • UITableViewCellStyleValue2
  • UITableViewCellStyleSubtitle

 

Попробуйте изменять эти стили и посмотрите как преображается ваша таблица.

 

Кроме текста есть возможность вставлять в ячейку картинку. Для примера возмем эту картинку и добавим ее в наш проект. Для этого скачайте картинку в любое удобное место на вашем компьютере и перетяните на папку Supporting Files. После чего отпустите кнопку мышки и перед вами появится диалоговое окно добавления файла. Все пункты в этом меню должны быть выбраны как на картинке.

 

 

Затем нажмите кнопку Finish и в проекте появится только что добавленный файл. С компьютера этот файл можно удалять (мы его скопировали в проект).

 

Для отображения картинки после установки значения атрибуту detailTextLabel добавим следующий код:

 

<code data-result="[object Object]">cell.imageView.image = [UIImage imageNamed:@"home-ios-sdk.png"];</code>

 

После всех изменений метод cellForRowAtIndexPath должен выглядеть так:

 

<code data-result="[object Object]">- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
                                       reuseIdentifier:CellIdentifier] autorelease];
        cell.selectionStyle = UITableViewCellSelectionStyleGray;

        if (indexPath.row == 2) {
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        } else if (indexPath.row == 3) {
            cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
        }
    }

    cell.textLabel.text = [students objectAtIndex:indexPath.row];
    cell.detailTextLabel.text = @"Student";
    cell.imageView.image = [UIImage imageNamed:@"home-ios-sdk.png"];

    return cell;
}</code>

 

Это основные свойства ячейки, исходный код можно скачать здесь.