我一直在努力实现协议和委托的例子。
我的MainVC对CategoryVC有模态搜索,但是CategoryVC将用户发送到DetailVC。
我需要将MainVC设置为DetailVC的委托,但是当MainVC实例化DetailVC时,我可以找到的所有示例都将MainVC设置为DetailVC的委托。我的DetailVC未由MainVC实例化。
我想完成
detailVC.delegate = self
但是因为我正在使用Interface Builder Modal Segues,所以我不知道如何引用该对象。
编辑:MainVC有一个正在编辑的图像和添加叠加的功能CategoryVC具有叠加类别DetailVC有一个UICollectionView显示所有叠加可供选择
我希望DetailVC传递给MainVC,它覆盖以添加到图像
所以顺序是MainVC
(模态segue) - > CategoryVC
(模态segue) - > DetailVC
听起来CategoryVC
需要将有关mainVC的信息转发给DetailVC。
你可以给CategoryVC
一个属性theMainVC
,用来记住MainVC。
所以在MainVC
的prepareForSegue:
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let theCategoryVC = segue.destination as? CategoryVC {
theCategoryVC.theMainVC = self
}
}
然后在你的CategoryVC
:
var theMainVC: MainVC?
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let theDetailVC = segue.destination as? DetailVC {
theDetailVC.delegate = theMainVC
}
}
您当前的问题有很多解决方案
1-连锁代表
protocol MYDataSender {
func myDele(str:String)
}
class MainVC:UIViewController,MYDataSender{
func myDele(str:String) { print(str) }
}
当存在C类
let cat = ///
cat.delegate = self // if you don't use self.present(vc ,,, then it would be inside prepareForSegue
class CategoryVC:UIViewController{
var delegate:MYDataSender!
}
当存在DetailsVC
let det = //
det.delegete = delegate // rhs is CategoryVC'sdelegete = MainVC , if you don't use self.present(vc ,,, then it would be inside prepareForSegue
class DetailsVC:UIViewController{
var delegate:MYDataSender!
func send() {
delegate.myDele(str:"sendToMain")
}
}
2- NotificationCenter //最简单的
3-共享单身人士
4-存储数据