Чтение онлайн

на главную - закладки

Жанры

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

В коде, приведенном в подразделе «Решение» данного раздела, мы создаем кнопки для всех ячеек, находящихся в табличном виде. При нажатии кнопки в любой ячейке вызывается метод performExpand:. И если вы думаете примерно так же, как я, то вы уже стали задаваться вопросом: как же определить, к какой именно ячейке относится кнопка-отправитель? Итак, теперь нам нужно как-то связать кнопки с теми ячейками, к которым они относятся.

Один из способов разрешения этой ситуации связан с использованием свойства tag экземпляра кнопки. Это свойство-метка представляет собой обычное целое число, которое, как правило, используется для ассоциирования вида с другим объектом. Например, если вы хотите ассоциировать кнопку с третьей ячейкой в вашем табличном виде, то следует задать для свойства-метки этой кнопки значение 3. Но здесь возникает проблема: в табличных видах есть разделы, и каждый раздел может содержать n ячеек. Следовательно, нам требуется возможность определить и раздел таблицы, и ячейку, которая владеет нашей кнопкой. А поскольку значением свойства-метки может быть только одно целое число, эта задача существенно усложняется. Поэтому мы можем отказаться от метки и вместо работы с ней запрашивать вышестоящий вид о дополнительном виде, рекурсивно проходя вверх по цепочке видов, пока не найдем ячейку типа UITableViewCell, вот так:

— (UIView *) superviewOfType:(Class)paramSuperviewClass

forView:(UIView *)paramView{

if (paramView.superview!= nil){

if ([paramView.superview isKindOfClass: paramSuperviewClass]){

return paramView.superview;

} else {

return [self superviewOfType: paramSuperviewClass

forView: paramView.superview];

}

}

return nil;

}

— (void) performExpand:(UIButton *)paramSender{

/* Обрабатываем событие нажатия кнопки */

__unused UITableViewCell *parentCell =

(UITableViewCell *)[self superviewOfType: [UITableViewCell class]

forView: paramSender];

/* Теперь, если желаете, можете еще что-нибудь сделать с ячейкой */

}

Здесь мы используем простой рекурсивный метод, принимающий вид (в данном случае нашу кнопку) и имя класса (в данном случае

UITableViewCell
), а затем просматриваем иерархию вида, являющегося вышестоящим для данного, чтобы найти вышестоящий вид, относящийся к интересующему нас классу. Итак, он начинает работу с вида, являющегося вышестоящим для заданного, и если этот вышестоящий вид не относится к требуемому типу, то просматривает и его вышестоящий вид, и так до тех пор, пока не найдет один из вышестоящих видов, относящийся к требуемому классу. Как видите, в качестве первого параметра метода
superviewOfType: forView:
мы используем структуру Class. В этом типе данных может содержаться имя любого класса из языка Objective-C, и это весьма кстати, если вы ищете или запрашиваете у программиста конкретные имена классов.

4.4. Обеспечение удаления смахиванием в ячейках табличных видов

Постановка задачи

Необходимо предоставить пользователям приложения возможность без труда удалять строки из табличного вида.

Решение

Реализуйте в делегате табличного вида селектор

tableView: editingStyleForRowAtIndexPath:
, а в источнике данных табличного вида — селектор
tableView: commitEditingStyle: forRowAtIndexPath::

— (UITableViewCellEditingStyle)tableView:(UITableView *)tableView

editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{

return UITableViewCellEditingStyleDelete;

}

— (void) setEditing:(BOOL)editing

animated:(BOOL)animated{

[super setEditing: editing

animated: animated];

[self.myTableView setEditing: editing

animated: animated];

}

— (void) tableView:(UITableView *)tableView

commitEditingStyle:(UITableViewCellEditingStyle)editingStyle

forRowAtIndexPath:(NSIndexPath *)indexPath{

if (editingStyle == UITableViewCellEditingStyleDelete){

/* Сначала удаляем этот объект из источника данных */

[self.allRows removeObjectAtIndex: indexPath.row];

/* Потом удаляем ассоциированную с ним ячейку из табличного вида */

[tableView deleteRowsAtIndexPaths:@[indexPath]

withRowAnimation: UITableViewRowAnimationLeft];

}

}

Метод

tableView: editingStyleForRowAtIndexPath
: позволяет выполнять операции удаления. Он вызывается табличным видом, а его возвращаемое значение определяет, какие операции пользователь может делать в табличном виде (вставлять информацию, удалять информацию и т. д.). Метод
tableView: commitEditingStyle: forRowAtIndexPath:
выполняет затребованную пользователем операцию удаления. Второй из указанных методов определяется в делегате, но его функционал несколько перегружен: этот метод применяется не только для удаления данных, но и для удаления строк из таблицы.

Обсуждение

Табличный вид реагирует на жест смахивания (Swipe), отображая кнопку в правой части затронутой строки (рис. 4.5). Как видите, табличный вид не находится в режиме редактирования, но эта кнопка позволяет пользователю удалить строку.

Рис. 4.5. Кнопка для удаления, появляющаяся в ячейке табличного вида

Такой режим активизируется путем реализации метода

tableView: editingStyleForRowAtIndexPath:
(определяемого в протоколе
UITableViewDelegate
), чье возвращаемое значение указывает, будут ли в таблице разрешаться операции вставки, или удаления, или обе эти операции, или ни одна из них. Реализуя метод
tableView: commitEditingStyle: forRowAtIndexPath:
в источнике данных табличного вида, можно также получать уведомление о том, какую операцию выполнил пользователь, вставку или удаление.

Второй параметр метода

deleteRowsAtIndexPaths: withRowAnimation:
позволяет указывать метод анимации, который будет выполняться при удалении строк из табличного вида. В примере мы задали, что удаляемые строки будут уходить с экрана в направлении справа налево.

4.5. Создание верхних и нижних колонтитулов в табличных видах

Постановка задачи

Необходимо создать в таблице верхний и/или нижний колонтитул.

Поделиться:
Популярные книги

Сын счастья

Вассму Хербьёрг
2. Книга Дины
Проза:
современная проза
5.00
рейтинг книги
Сын счастья

Кодекс Охотника. Книга VII

Винокуров Юрий
7. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.75
рейтинг книги
Кодекс Охотника. Книга VII

Глава рода

Шелег Дмитрий Витальевич
5. Живой лёд
Фантастика:
боевая фантастика
6.55
рейтинг книги
Глава рода

Телохранитель Генсека. Том 1

Алмазный Петр
1. Медведев
Фантастика:
попаданцы
альтернативная история
7.00
рейтинг книги
Телохранитель Генсека. Том 1

Локки 4 Потомок бога

Решетов Евгений Валерьевич
4. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Локки 4 Потомок бога

Хроники Тириса. Книга 3

Маханенко Василий Михайлович
3. Хроники Тириса
Фантастика:
боевая фантастика
космическая фантастика
фантастика: прочее
5.00
рейтинг книги
Хроники Тириса. Книга 3

Сирийский рубеж 3

Дорин Михаил
7. Рубеж
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сирийский рубеж 3

Русские дети (сборник)

Фрай Макс
Проза:
современная проза
5.60
рейтинг книги
Русские дети (сборник)

Я все еще царь. Книга XXXI

Дрейк Сириус
31. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я все еще царь. Книга XXXI

Рождественский детектив (сборник рассказов)

Полякова Татьяна Викторовна
Детективы:
прочие детективы
6.00
рейтинг книги
Рождественский детектив (сборник рассказов)

Кодекс Охотника. Книга XXXVII

Винокуров Юрий
37. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXVII

Шиари выбирает первой

Чернованова Валерия Михайловна
1. Шиари
Фантастика:
юмористическая фантастика
5.25
рейтинг книги
Шиари выбирает первой

Последний Паладин. Том 14

Саваровский Роман
14. Путь Паладина
Фантастика:
аниме
фэнтези
попаданцы
5.75
рейтинг книги
Последний Паладин. Том 14

Ученик

Листратов Валерий
2. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Ученик