Метод TableView.reloadData() не работает

#ios #swift

#iOS #swift

Вопрос:

Я новичок в разработке iOS app.my история в том, что у меня есть завершение обработки новых данных из API, которые уведомляются с помощью ввода-вывода сокета, каждый раз, когда сокет успешен, я хочу перезагрузить tableview. и сокет работает нормально. Проблема в том, что при первом входе в мое приложение метод tableview.reload не работает, но при повторном запуске моего проекта все в порядке.итак, я хочу спросить, почему tableview не перезагружается в первый раз прямо здесь?. Заранее благодарю вас!!

Примечание1: для tableview.reloadData() не работает, я имею в виду, что он не вызывает вызовы cellForRowAtIndexPath, которые я уже напечатал и установил точку останова для метода cellForRowAtIndexPath

Примечание 2: tableview отображает tableViewCell один раз, и я пытаюсь вызвать tableview.reloadData () для повторного отображения ячейки для обновления пользовательского интерфейса, но это не работает.

Это мой код

  override func viewDidLoad() {
   super.viewDidLoad() 
   ....................
   ChatSocketManagerOnline.shared.lastMessageOn { (data) in
   self.data = data            
   self.tableView.reloadData()
 }
  

Комментарии:

1. Вы установили источник данных для TableView?

2. Что вы имеете в виду, это не работает? Что происходит?

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

4. попробуйте это в основном потоке…

5. @PGDev да, у меня есть

Ответ №1:

 try

override func viewDidLoad() {
   super.viewDidLoad() 
   ....................
   ChatSocketManagerOnline.shared.lastMessageOn { [weak self] (data) in
        DispatchQueue.main.async {
            self?.data = data            
            self?.tableView.reloadData()
        }
   
 }
  

Ответ №2:

Потому что вы ChatSocketManagerOnline.shared.lastMessageOn вводите viewDidLoad() так, что в вашем табличном представлении данные будут перезагружены один раз при запуске приложения. Пожалуйста, прочитайте документ https://developer.apple.com/documentation/uikit/uiviewcontroller/1621495-viewdidload

Вы должны использовать NotificationCenter для определения успешного выполнения сокета, а затем перезагрузить tableview.

Комментарии:

1. Как вы сказали, перезагрузка данных не должна выполняться в любое время, но в моем случае, когда я повторно запускаю приложение во второй раз, это работает. в результате я не знаю, чего мне здесь не хватает. в любом случае, спасибо вам за вашу помощь.