2013-06-27 1 views
0

У меня есть UITableView с разделами, из которых я пытаюсь удалить строки. При переключении на AFMotion из BubbleWrap я начал получать несколько неизменных ошибок массива. Обычно они фиксируются путем добавления mutableCopy на объект, который я изменяю, прежде чем нажимать его контроллер вида. Однако для таблицы с разделами я прохожу мимо замороженной/неизменяемой ошибки массива, но получаю NSInternalInconsistencyException: Invalid update: invalid number of rows in section 0. Я видел другие вопросы по этим вопросам и попытался добавить beginUpdates, endUpdates и т. Д., Но он все равно не сработает.NSInternalInconsistencyException: Неверное обновление в таблицеView с разделами

Мой объект данных является хэш, который выглядит следующим образом:

{ 
    "Items" => ["one", "two", "three"], 
    "More" => ["four", "five", "six"] 
} 

я прохожу, что данные на новый контроллер, когда я представляю его:

def tap_items(sender) 
    controller  = ItemsController.alloc.initWithNibName(nil, bundle:nil) 
    controller.data = @data[:items].mutableCopy 
    self.presentViewController(
    UINavigationController.alloc.initWithRootViewController(controller), 
    animated:true, 
    completion: lambda {} 
) 
end 

Тогда в ItemsController мой стол настроенное для удаления строк следующего содержания:

def tableView(tableView, commitEditingStyle:editingStyle, forRowAtIndexPath:indexPath) 
    if editingStyle == UITableViewCellEditingStyleDelete 
    rows_for_section(indexPath.section).delete_at indexPath.row 
    tableView.deleteRowsAtIndexPaths([indexPath], 
     withRowAnimation:UITableViewRowAnimationFade) 
    end 
end 

Но это порождает внутреннюю несогласованность e xception ошибки. Я также пробовал data[sections[indexPath.section]].delete_at indexPath.row вместо rows_for_section(indexPath.section).delete_at indexPath.row. Но это ничего не меняет.

Обновление: Вот код для моего Tableview

def viewDidLoad 
    super 

    @table = UITableView.alloc.initWithFrame(self.view.bounds) 
    @table.autoresizingMask = UIViewAutoresizingFlexibleHeight 
    self.view.addSubview(@table) 

    @table.dataSource = self 
    @table.delegate = self 
end 

def sections 
    data.keys.sort 
end 

def rows_for_section(section_index) 
    data[self.sections[section_index]].mutableCopy 
end 

def row_for_index_path(index_path) 
    rows_for_section(index_path.section)[index_path.row] 
end 

def tableView(tableView, titleForHeaderInSection:section) 
    sections[section] 
end 

def numberOfSectionsInTableView(tableView) 
    self.sections.count 
end 

def tableView(tableView, numberOfRowsInSection: section) 
    rows_for_section(section).count 
end 
+0

Я не эксперт по Ruby, поэтому я точно не знаю, как это ведет себя ... но разве вы не удаляете из изменяемой копии своих данных (как возвращено row_for_section), а не редактируете сами исходные данные? Вы упомянули, что вы пытались изменить каждый из них по отдельности, но попытались удалить запись из данных BOTH и rows_for_section? – James

+0

У меня есть, но там я получаю 'не могу изменить замороженный/неизменный массив' – tvalent2

ответ

0

Это звучит как-то вы не ссылки на правильный экземпляр вашего DataSource. Вы не показываете, где вы его назначаете, т. Е. tableView.dataSource = data, а также код для rows_for_section. Мне интересно, имеет ли это отношение к .mutableCopy. По какой-то причине это необходимо?

В моем приложении я вставляю источник данных непосредственно из таблицыView, то есть tableView.dataSource.

+0

Просто обновлен с моим кодом' rows_for_section' и 'dataSource'. Благодаря! – tvalent2

+0

Если бы это было полезно, не забудьте выбрать ответ, ура. – aceofspades

+0

Если я удаляю '.mutableCopy' из rows_for_section, я не могу изменить неизменяемый/замороженный массив. Вот почему я так выразился. Я добавил его к данным, которые я передал, потому что я хотел посмотреть, что бы это сделало. – tvalent2