2015-11-04 4 views
0

Мой вопрос может выглядеть просто, но он не работает. Я много искал и пытался много методов, но он не хочет работать!Как обновлять, а не перезагружать UITableView?

Итак, у меня есть UITableView. На заднем плане одна из моих функций работает и обнаруживает, что если новое сообщение получено, оно записывает это значение в Core Data, и я хочу добавить значки в свои ячейки, когда получаю новое сообщение.

Но когда я пытаюсь это:

func reloadTableView() { 
    dispatch_async(dispatch_get_main_queue(),{ 
     self.tableView.reloadData() 
    }) 
} 

не обновляет свою Tableview и не показывают новые значки. Для этого мне нужно:

  1. Изменить мой контроллер и вернуться к нему
  2. Или мне нужно перетащить мой Tableview наверх и оставить его

в этих случаях он будет показывать свои значки.

Итак, как я могу обновить мой tableView, чтобы показать новые добавленные значки, не описанные выше 2 метода?

UPDATE

enter image description here

UPDATE 2

У меня есть 2 файла: ContactsTableViewController и Messages.swift.

В моей Messages.swift я обрабатывать новые сообщения, и когда я получаю новое сообщение я получаю в журналах:

print("New message for \(user.jidStr)") 
ContactsTableViewController().reloadTableView() 

В моем ContactsTableViewController:

func reloadTableView() { 
    self.tableView.reloadData() 
    print("updated") 
} 

Это перегружает мой Tableview, как я получите updated сообщение в журналах, но оно не обновлено, и мои значки

+0

Как вы создали свой вид на стол? Где вы реализовали свой источник данных и делегат? – Simon

+0

@Simon 'class ContactsTableViewController: UITableViewController {' и я добавил скриншот. Пожалуйста, посмотрите на него в моем вопросе. –

+0

Попробуйте проверить, что reloadTableView() вызывается из основного потока. –

ответ

1

Пример в Objective-C:

[_tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade]; 

Пример в Swift 2.0:

self.tableView.reloadRowsAtIndexPaths([NSIndexSet, indexSetWithIndex:0], withRowAnimation: UITableViewRowAnimation.Automatic) 
0

ли вы попробовать NSOperationQeue?

func reloadTableView() { 
    NSOperationQueue.mainQueue().addOperationWithBlock { 
     self.tableView.reloadData() 
    }) 
}   

Edit (потому что я не могу комментировать)

override func viewDidLoad() { NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "reloadTableView", userInfo: nil, repeats: true) } 

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

2

Попробуйте обновить только клетки, которые получают новое сообщение с:

self.tableView.beginUpdates() 
self.tableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: row, inSection: section)], withRowAnimation: UITableViewRowAnimation.Fade) 
self.tableView.endUpdates() 

где row - строка из вашей ячейки в нем раздел, который получит сообщение

0

reloadData должен работать ... (я думаю, что лучше называть его основной темой.)

Вы проверили, что ваш массив объектов правильный? Если он исходит из запроса CoreData, он может использовать кеш. Убедитесь, что вы синхронизировали CoreDataContext (вызывая метод сохранения в контексте после вставки) и что ваша выборка возвращает последние созданные объекты.

Просто догадаться ...

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