我的collectionView插座有问题。我在标签栏控制器中没有几个VC,在主VC上我有带有设置VC的设置按钮。显然,这是设置VC对主VC的影响。但是,总是在我取消设置VC后尝试重新加载collectionView的数据时,出现错误“意外地发现nil,同时隐式展开一个Optional值”
我尝试了各种方法来更改VC(performSegue,present(VC)和dismiss)始终保持相同的结果
mainVC
@IBAction func settingsTappedButton(_ sender: UIButton) {
performSegue(withIdentifier: "goToSettings", sender: self)
}
var query = false {
didSet{
GetPostsID(withQuery: !oldValue)
}
}
settingsVC
@IBAction func ApplyFiltersTapped(_ sender: UIButton) {
let displayVC : ViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController") as! ViewController
displayVC.query = true
dismiss(animated: true, completion: nil)
}
mainVC中的函数GetPostID self.collectionView.reloadData()
中存在错误
在viewDidLoad中也调用了GetPostID,因此此出口可在首次运行的应用程序上使用
我只是希望在设置VC中更改设置后重新加载所有数据
答案 0 :(得分:0)
您正在设置对全新ViewController
的查询,该查询与提供VC的查询不同。
基本上,您需要“向后”传递数据。一种方法是使用委托模式。
创建一个SettingsViewControllerDelegate
:
protocol SettingsViewControllerDelegate : class {
func queryDidChange(_ vc: SettingsViewController, newValue: Bool)
}
并使其符合ViewController
:
extension ViewController : SettingsViewControllerDelegate {
func queryDidChange(_ vc: SettingsViewController, newValue: Bool) {
query = newValue
}
}
在delegate
中添加一个SettingsViewController
属性:
weak var delegate: SettingsViewControllerDelegate?
在适当的时候调用委托方法:
@IBAction func ApplyFiltersTapped(_ sender: UIButton) {
delegate?.queryDidChange(self, newValue: true)
dismiss(animated: true, completion: nil)
}
然后在prepareForSegue
的{{1}}中,将ViewController
设置为委托:
self
此外,设置属性观察器的方式可能会引起问题。您应该使用新值而不是if let vc = segue.destination as? SettingsViewController {
vc.delegate = self
}
,因为即使新值与旧值相同,也会调用属性观察器。
!oldValue