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

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

Жанры

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. Создание верхних и нижних колонтитулов в табличных видах

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

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

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

Первый среди равных. Книга VI

Бор Жорж
6. Первый среди Равных
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга VI

Я Гордый часть 2

Машуков Тимур
2. Стальные яйца
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я Гордый часть 2

Я все еще не князь. Книга XV

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

Хозяйка забытой усадьбы

Воронцова Александра
5. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка забытой усадьбы

Гримуар темного лорда V

Грехов Тимофей
5. Гримуар темного лорда
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда V

Матабар VIII

Клеванский Кирилл Сергеевич
8. Матабар
Проза:
магический реализм
5.00
рейтинг книги
Матабар VIII

Сапер. Том II

Вязовский Алексей
2. Сапер
Фантастика:
альтернативная история
4.25
рейтинг книги
Сапер. Том II

Последний Герой. Том 4

Дамиров Рафаэль
Последний герой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Последний Герой. Том 4

Менталист. Революция

Еслер Андрей
3. Выиграть у времени
Фантастика:
боевая фантастика
5.48
рейтинг книги
Менталист. Революция

Тринадцатый X

NikL
10. Видящий смерть
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Тринадцатый X

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Деревенщина в Пекине 2

Афанасьев Семён
2. Пекин
Фантастика:
попаданцы
дорама
фантастика: прочее
5.00
рейтинг книги
Деревенщина в Пекине 2

Мастер 11

Чащин Валерий
11. Мастер
Фантастика:
боевая фантастика
попаданцы
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Мастер 11