无法使用Firebase提取的新数据重新加载CollectionView

时间:2019-09-19 13:56:46

标签: ios swift uicollectionview

当我在CategoryVc中选择一个单元格时,它应该弹出MainVc并在CollectionView中显示新数据,但事实并非如此。它仅在我运行应用程序时加载数据。 我检查了一下,选择单元格后,selectedCategory var获得了正确的String并调用了刷新函数。我不明白怎么了。

编辑:如果我按下视图控制器而不是将其弹出,那么它将起作用。但是我需要弹出它。
它还会打印正确的选择
mainVc是一个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)
    }

CategoryVc

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

2 个答案:

答案 0 :(得分:0)

缺少的部分之一未使用主线程。当您使用collectionView的reloadData与主线程一起使用时。

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

然后另一件事是,如果您想在向后控制器中处理任何事情,我建议您使用Protocol / Delegates.

描述协议

protocol Handler:class{
    func reloadHandler()
}

然后使用您的MainController进行扩展。扩展后,在协议功能中使用您自己的重载功能。

extension MainController: Handler{

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

然后在目标ViewController中委派协议

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

在推送targetController之前,必须将self分配给TargetController.的委托

var target = TargetController()
target.delegate = self

设置两个控制器之间的委托。现在该触发您的动作了。在目标控制器中,当您触发reload()时,请使用delegate?.reloadHandler()

答案 1 :(得分:0)

问题是您在刷新数据之前弹出视图控制器。尝试更改顺序,例如:

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