2017-01-26 3 views
0

Я в замешательстве. У меня есть динамический tableView для отображения моих данных и метода loadData(), где я в основном загружаю данные из JSON в tableViewModel. Теперь я хотел устранить дублирование данных каждый раз, когда обновление таблицы или освежает, для которых я реализовал:UITableView confusion

override func viewDidDisappear(animated: Bool) { 
     super.viewDidDisappear(animated) 

     // To avoid duplication of data when the table updates or refreshes. 
     self.tableViewModel.removeAll(keepCapacity: false) 
    } 

Проблема была решена. Теперь, когда я переключаюсь между своими представлениями и возвращаюсь к tableView, он дает мне ошибку index out of range. Я попытался перезагрузить мой tableView после self.tableViewModel.removeAll, но это просто перезагружает пустой tableView для меня, поскольку tableViewModel пуст. Если я позвоню loadData() после self.tableViewModel.removeAll, он снова начнет дублировать мои данные.

Как я могу это решить? И как мне следует использовать viewDidDisappear, viewDidAppear, viewWillDisappear, viewWillAppear без дублирования моих данных, а также для спасения от ошибки index out range?

+0

Каков тип 'tableViewModel'? Если это тип, который вы создали, можете ли вы показать, как он определяется? Также покажите методы источника данных, потому что там может быть вызван объект вне диапазона. – Sweeper

+2

Не могли бы вы разместить полное сообщение об ошибке и все функции, связанные с делегатом 'UITableViewDataSource'? Как вы загружаете данные? Я не совсем уверен, что вы упомянули о tableViewModel. Проблема, вероятно, связана с 'func tableView (UITableView, numberOfRowsInSection: Int)' или в 'tableViewModel'. Вы должны подготовить данные в 'viewWillAppear', если данные динамические. И подготовьте данные в 'viewDidLoad', если данные будут исправлены. –

+0

@Sweeper tableViewModel - это структура, которую я определил как 'init (json: NSDictionary)'. Там много, что мне нужно будет опубликовать здесь, если вы хотите, чтобы я опубликовал все методы источников данных. Но, насколько я знаю, ошибка, скорее всего, в номереOfRowsInSection. Я реализовал это как: return tableViewModel.count. Хотя, я исправил проблему, если у вас все еще есть лучшие практики, это было бы здорово. – waseefakhtar

ответ

0

Для меня он работал, изменив место self.tableViewModel.removeAll(keepCapacity: false) от viewDidDisappear моей методы л oadData() как:

func loadData() { 
     // To avoid duplication of data when the table updates or refreshes. 
     self.tableViewModel.removeAll(keepCapacity: false) 
     print("Table View Model Cleared: \(self.tableViewModel)”) 

     // Now load data from the internet. 
} 

Что это сделало это освежающий Tableview с новыми данными каждый раз, когда loadData() называется так, что Tableview не сохраняет старые данные и дублирует их с новыми.

Это также спасает меня от fatal error: Index out of range, так как removeAll и данные по загрузке осуществляются одним способом, а не двумя отдельными. Когда я поместил removeAll в viewDidDisappear, было бы очистить tableViewModel каждый раз, когда я переключился на другой вид и при переходе обратно, он бы затеряться в:

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {  

     return tableViewModel.count 
    } 

На мой взгляд, The fatal error: Index out of range говорит нам о том, что количество строк в нашем TableView не соответствует количеству сообщений в таблицеViewModel. И это именно то, что мы возвращаем в numberOfRowsInSection.

Любые предложения и передовой опыт были бы весьма полезными. Кроме того, поправьте меня где угодно, я ошибаюсь.

+0

Обычно вы получаете массив из источника данных var dataArray = Repositor.getXxxxxTableDataModel() 'и после некоторых возможных модификаций вы можете установить это прямо в' self.tableViewModel = dataArray' в свои данные загрузки (и не приложить его), затем вам не нужно 'removeAll' – muescha