Как прокрутить до последнего сообщения, отправленного при viewdidload? в быстром 4 - PullRequest
0 голосов
/ 02 мая 2018

В настоящее время я пробовал

func scrollToBottom(){
    DispatchQueue.global(qos: .background).async {
        let indexPath = IndexPath(item: self,messageArrat.count-1, section: 0)
        self.messageTableView.scrollToRow(at: indexPath,at:.bottom,animated:true)
    } 
}

Однако, похоже, не работает, вывод

Thread 16: ESC_BAD_ACCESS (code=1, address=0xfffffffffffffffc)
UITableView.scrollToRow(at:at:animated:) must be used from main thread only

Я вызываю функцию сразу после установки делегата и источника данных в viewdidload.

Ответы [ 6 ]

0 голосов
/ 03 мая 2018

Звучит как проблема синхронизации, вы сказали, что вызываете это из viewDidLoad, попробуйте вместо этого переместить его в viewDidAppear или viewDidLayoutSubviews. Также удалите из фонового потока, поскольку вы управляете пользовательским интерфейсом, и это должно произойти в основном потоке.

0 голосов
/ 03 мая 2018

Может быть, индексный путь не должен быть ограничен, попробуйте проверить количество строк перед прокруткой. Также сделайте все опционы в главном потоке.

0 голосов
/ 02 мая 2018

Вам не нужно добавлять DispatchQueue:

let indexPath = IndexPath(item: self.messageArrat.count-1, section: 0)
self.messageTableView.scrollToRow(at:  indexPath, at: .bottom, animated: true)

А если вы хотите DispatchQueue, добавьте основную очередь следующим образом:

DispatchQueue.main.async {
    let indexPath = IndexPath(item: self.messageArrat.count-1, section: 0)
    self.messageTableView.scrollToRow(at:  indexPath, at: .bottom, animated: true)
}
0 голосов
/ 02 мая 2018

Запись кода в «.async» закрывает начало нового потока, а сообщение об ошибке буквально говорит вам, что вы этого не делаете.

Удалить DispatchQueue материал и все.

И, пожалуйста, опубликуйте текст, описание и все такое, чтобы помочь сообществу.

0 голосов
/ 02 мая 2018

Ему нравится работать в этом основном потоке, а не в фоновом режиме, потому что он связан с пользовательским интерфейсом

попробуйте этот код:

 func scrollToBottom() {

       DispatchQueue.main.async {

                    let indexPath = IndexPath(item: self.messageArrat.count-1, section: 0)                        
                    self.messageTableView.scrollToRow(at:  indexPath, at: .bottom, animated: true)
             } 
      }
0 голосов
/ 02 мая 2018

Прежде всего: пожалуйста, укажите свой код в виде текста, а не изображения.

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

например:.

DispatchQueue.main.async {
    //code Here
}

Но я думаю, что вам вообще не нужен DispatchQueue, поэтому постарайтесь полностью его пропустить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...