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

Редактирование таблиц

У всех таблиц, которые мы рассматривали есть полезное свойство. Эти таблицы можно изменять. Давайте посмотрим как это делается.

 

 

Чтобы не создавать новый проект воспользуемся уже имеющимся кодом с нашего первого знакомства с таблицами. Но здесь есть один важный момент. Таблица получает данные с источника и отображает их на экране. Если мы хотим редактировать таблицу — нам следует редактировать источник данных, а потом выводить результат редактирования в таблицу. Это означает, что у источника данных должен быть изменяемый тип. Давайте приведем наш массив students к типу NSMutableArray. Теперь интерфейс класса RootViewControllerвыглядит так:

 

<code data-result="[object Object]">#import &lt;UIKit/UIKit.h&gt;

@interface RootViewController : UITableViewController {
    NSMutableArray *students;
}

@property (nonatomic, retain) NSMutableArray *students;

@end</code>

 

И в методе viewDidLoad изменим процедуру создания массива:

 

<code data-result="[object Object]">- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = @"Students";

    self.students = [NSMutableArray arrayWithObjects:@"Tom", @"Bill", @"Tom", @"Joe", @"Tom", nil];
}</code>

 

Продолжим работу с реализацией класса RootViewController. Найдите, раскомментируйте и измените метод commitEditingStyle.

 

<code data-result="[object Object]">- (void)tableView:(UITableView *)tableView 
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [students removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
                         withRowAnimation:UITableViewRowAnimationFade];
    }
}</code>

 

Теперь, если вы проведете пальцем по ячейке таблицы слева направо — таблица перейдет в режим редактирования, а в правой части ячейки появится кнопка Delate.

 

 

В этом методе в первую очередь мы проверяем тип редактирования таблицы, ведь кроме удаления — мы можем добавлять ячейки, менять их местами. Затем, зная значение indexPath, удаляем из массива элемент под индексом, который храниться в indexPath и плавно, с анимацией удаляем саму ячейку.

 

Кроме проведения пальцем по ячейке есть возможность перевести всю таблицу в режим редактирования. Для этого добавим кнопку на наш UINavigationController (подробнее о работе с этим классом я опишу позже). Чтобы добавить кнопку следует изменить метод viewDidLoad, после инициализации массива добавьте следующий код:

<code data-result="[object Object]">UIBarButtonItem *edit =[[[UIBarButtonItem alloc] 
                         initWithBarButtonSystemItem:UIBarButtonSystemItemEdit
                         target:self
                         action:@selector(editing)] autorelease];
self.navigationItem.rightBarButtonItem = edit;</code>

 

А после самого метода viewDidLoad  добавьте метод editing, этот метод и будет вызываться при нажатии на нашу кнопку и переводить таблицу в режим редактирования.

 

<code data-result="[object Object]">- (void)editing {
    [self.tableView setEditing:!self.tableView.editing animated:YES];
}</code>

 

В нем мы проверяем в каком режиме находится таблица сейчас и устанавливаем ей обратный режим (если таблица в режиме редактирования — выходим с нее, а если нет — переводим ее в режим редактирования).

 

Если все сделано правильно, то при нажатии на кнопку Edit вы получите такой результат:

 

 

При нажатии на красную кнопку минус в левой части ячеек — появится знакомая кнопка Delete, а саму обработку удаления ячеек мы уже описали в методе commitEditingStyle.

Если язык интерфейса вашей программы отличается от английского — вы можете изменить надпись «Delete«. Для этого используйте метод titleForDeleteConfirmationButtonForRowAtIndexPath:

 

<code data-result="[object Object]">- (NSString *)tableView:(UITableView *)tableView 
titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    return @"Удалить";
}</code>

 

Теперь попробуем менять местами ячейки таблицы. Чтобы разрешить эту возможность для таблицы в методе canMoveRowAtIndexPath следует возвратить значение YES.

 

<code data-result="[object Object]">- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 
    return YES;
}</code>

 

Теперь раскомментируйте и измените метод moveRowAtIndexPath, в нем мы будем организовывать изменение данных в нашем источнике.

 

<code data-result="[object Object]">- (void)tableView:(UITableView *)tableView 
moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath 
      toIndexPath:(NSIndexPath *)destinationIndexPath 
{ 
    [students exchangeObjectAtIndex:sourceIndexPath.row withObjectAtIndex:destinationIndexPath.row];
}</code>

 

Как видите, мы просто меняем местами элементы массива.

 

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

 

 

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

 

<code data-result="[object Object]">- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView 
           editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if (indexPath.row == 0) {
        return UITableViewCellEditingStyleInsert;
    } else {
        return UITableViewCellEditingStyleDelete;
    }
}</code>

 

В этом методы мы для всех ячеек (кроме первой) указали тип редактирования «удаление», а первой — «добавление». Если вы сейчас запустите программу — возле первой ячейки в левой ее части увидите, не привычный минус, а плюс. Но при нажатии на него ничего не произойдет. Чтобы организовать добавление — нам прийдется изменить метод commitEditingStyle.

 

<code data-result="[object Object]">- (void)tableView:(UITableView *)tableView 
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {

        [students removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
                         withRowAnimation:UITableViewRowAnimationFade];

    } else if (editingStyle == UITableViewCellEditingStyleInsert) {

        [students insertObject:@"Tutorial" atIndex:0];
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
                         withRowAnimation:UITableViewRowAnimationFade];
    }
}</code>

 

Теперь мы добавили еще одно условие проверки типа редактирования. Если этот тип «добавление» — вставляем в начало массива новый элемент и для отображения этого элемента — добавляем в таблицу новую ячейку.

 

Это все методы редактирования таблицы. Исходный код можно скачать здесь.