При редактировании `UITableView` не вызывает didSelectRowAtIndexPath??

У меня есть UITableViewController где пользователь должен иметь возможность редактировать элементы. Чтобы включить редактирование, я использую это:

self.navigationItem.rightBarButtonItem = self.editButtonItem;

Для всех, кто не знает, откуда взялся self.editButtonItem, он предопределен SDK.

Итак, теперь, когда я нажимаю на любой элемент, этот метод называется:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

но как только я нажимаю кнопку редактирования и, когда редактирование активно, этот метод, кажется, не вызывается.

Есть идеи, что мне не хватает?

Это остальная часть кода, который связан с редактированием:

// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{
    // Return NO if you do not want the specified item to be editable.
    return YES;
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    return UITableViewCellEditingStyleNone;
}


- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{
    return NO;
}

Спасибо за помощь.

MCB

5 ответов

Решение

Вы должны установить свойство allowSelectionDuringEditing объекта UITableView в значение true.

Ссылка: UITableView - allowSelectionDuringEditing

Вы устанавливаете self.editing = YES когда кнопка редактирования нажата?

В режиме редактирования этот метод вызывается вместо didSelectRow при нажатии на строку:

tableView:commitEditingStyle:forRowAtIndexPath:.

Я решил эту проблему по-другому. Моя кнопка "Редактировать" была на моей собственной панели навигации, и по этой причине ее не вызывали. После того, как я встроил VC в Navigation Controller и поместил новую кнопку Edit в его элемент навигации, кнопка Edit начала вызываться.

Краткий ответ (язык Swift):

      @IBOutlet private weak var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.allowsSelectionDuringEditing = true // Magic happens here
}

но как только я нажимаю кнопку редактирования и, когда редактирование активно, этот метод, кажется, не вызывается.

Есть идеи, что мне не хватает?

Да. Вы ожидаете tableView:didSelectRowAtIndexPath: вызываться при нажатии кнопки на панели навигации. Это никогда не случится. Этот метод вызывается только при выборе строки.

При нажатии кнопки редактирования вы захотите перевести свою таблицу в режим редактирования. На ваш взгляд контроллер:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated]; // must be called first according to Apple docs

    [self.tableView setEditing:editing animated:animated];
}

Затем вы обрабатываете события редактирования, добавляя tableView:commitEditingStyle:forRowAtIndexPath: метод.

Другие вопросы по тегам