Не удается перезагрузить CollectionView с новыми извлеченными данными из Firebase - PullRequest
0 голосов
/ 19 сентября 2019

Когда я выбираю ячейку в CategoryVc, она должна появиться в MainVc и отображать новые данные в CollectionView, но это не так.Он загружает данные только при запуске приложения.Я проверил, и selectedCategory var получает правильную строку после выбора ячейки, и вызывается функция обновления.Я не могу понять, что не так.

Редактировать: Если я нажимаю контроллер представления вместо того, чтобы выдвигать его, это работает.Но мне нужно это сунуть.
Он также печатает оба выбранных права. Категория
Основным VC является UICollectionViewCell

MainVc

static var chosenCategory = "General"

    func fetchQuotes() {
        CATEGORIES_REF.child(QuoteCell.chosenCategory).observe(.childAdded) { (snapshot) in
            let quoteId = snapshot.key

            CATEGORIES_REF.child(QuoteCell.chosenCategory).child(quoteId).observeSingleEvent(of: .value, with: { (snapshot) in
                guard let dictionary = snapshot.value as? Dictionary<String, AnyObject> else { return }
                let quote = Quote(quoteId: quoteId, dictionary: dictionary)

                self.quotes.append(quote)
                self.collectionView.reloadData()
                print("second: \(QuoteCell.chosenCategory)")
            })
        }
    }

    func refresh() {
        quotes.removeAll()
        fetchQuotes()
        print(QuoteCell.chosenCategory)
    }

Категория Vc

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
            self.navigationController?.popViewController(animated: true)
            QuoteCell.chosenCategory = "\(categories[indexPath.item])"
            quoteCell.refresh()
    }

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Проблема в том, что вы подключаете контроллер представления перед обновлением данных.Попробуйте изменить порядок как:

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
     QuoteCell.chosenCategory = "\(categories[indexPath.item])"
     quoteCell.refresh()
     self.navigationController?.popViewController(animated: true)
}
0 голосов
/ 19 сентября 2019

одна из недостающих частей не использует основной поток.Когда вы используете reloadData из collectionView, используйте с основным потоком.

DispatchQueue.main.async { [weak self] in
    self.collectionView.reloadData()
}

И еще, если вы хотите что-то обработать в обратном контроллере, я бы рекомендовал вам использовать Protocol / Delegates.

Опишите протокол

protocol Handler:class{
    func reloadHandler()
}

Затем увеличьте его с помощью MainController.После расширения используйте свою собственную функцию перезагрузки в функции протокола.

extension MainController: Handler{

    func reloadHandler() {
            self.reload()
    }
}

Затем делегируйте протокол в target ViewController

class TargetController: UIViewController {
    weak var delegate: Handler?
}

Перед нажатием targetController вы должны присвоить self делегату.TargetController.

var target = TargetController()
target.delegate = self

Вы устанавливаете делегирование между двумя контроллерами.Пришло время запустить ваше действие.В целевом контроллере, когда вы запускаете reload(), используйте delegate?.reloadHandler().

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