当我在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()
}
答案 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)
}