2013-10-07 2 views
40

У меня есть viewController с UITableView, строки которого я разрешаю редактировать (удалять) с помощью салфетки - как в приложении Mail. Я делаю это с, среди прочего, этот метод:tableView: canEditRowAtIndexPath: сбой при появлении viewController

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 

    return YES; 
} 

Однако, если у меня есть кнопка удаления обнаружено, и в то же время я использую обратно навигации моего UINavigationController, то есть, когда я popViewControllerAnimated:, то приложение падает с следующее сообщение:

[ViewController Tableview: canEditRowAtIndexPath]: сообщение, отправленное высвобождены например 0xaae64d0

Как я могу решить эту проблему?

+1

В вашем методе 'dealloc' контроллера контроллера задайте свойство' edit' для представления таблицы 'NO'. –

+1

И установите свойства 'delegate' и' dataSource' в 'nil'. Хотя странно, что вам нужно будет это сделать ... –

+0

Отлично! Ваш первый комментарий прямо на месте, другие два вызова не нужны. Я буду рад принять ваш ответ, если вы его создадите. – artooras

ответ

75

На ваш взгляд, контроллер dealloc, установите для вида editing вид таблицы в NO.

+6

Это работает, но это только началось в iOS7. Любая идея почему? – Imran

+21

Потому что Apple написала какой-то ошибочный код. –

+0

Надеюсь, что все мы отправили отчеты об ошибках :) – theiOSDude

42

У меня была такая же проблема, но я использовал ARC, и я не хотел обманывать метод dealloc. Делать это в viewWillDisappear было достаточно, чтобы остановить крушение.

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [table setEditing:NO]; 
} 
+0

Неправильно ли иметь метод dealloc при ARC, если вы не вызываете [super dealloc]? – artooras

+0

Это не так. Принятый ответ ничего не сломает и будет компилироваться нормально.Вам буквально не будет позволено вызывать '[super dealloc]' или 'release', поскольку ARC должен называть их для вас. Мое предложение состояло в основном в том, чтобы уменьшить путаницу, поскольку я не хотел необычного метода dealloc, когда ни один из моих других классов не имеет такого. Также кажется странным, что нужно установить свойство в моменты объекта, прежде чем он, скорее всего, будет выпущен. –

+4

Этот метод иногда вызывает странное поведение, если вы представляете другие vcs и т. Д., Поэтому я бы использовал метод dealloc. – Imran

0
  1. Использование

    tableview.delegate = ноль в dealloc()

  2. Использование

    Tableview = ноль

0

Я знаю, что это старый но я недавно d эта проблема, и подумал, что другие могут извлечь выгоду из того, что я нашел: я использую Xcode 9 и iOS 11, и я использую новый метод использования SearchController. Если я нажал кнопку обратной связи системы во время поиска, я получил фатальный результат в tableView (_: canEditRowAt indexPath :). Изменение setEditing на false не решило мою проблему. Проблема заключалась в том, что я вернул true/false в моем переопределении canEditRowAt в зависимости от того, имел ли мой источник данных записи, но когда я искал, у меня был другой источник данных (фильтр-массив). Как только я проверил правильный источник данных, работала кнопка «Назад».

Смежные вопросы