我有2个容器视图,它们分别嵌入了UITableViewController(sideMenuVC)和UICollectionViewController(centerVC),我的CollectionVC在导航控制器本身内部。我把这两个容器视图放在第三个VC中,它是rootVC。现在我试图根据sideMenuVC中选择的行显示我的centerVC中的内容,并且我正在使用委托,但是当我尝试从发送方调用它时委托是nil。我已经尝试将委托设置为弱,并且还在awakeFromNib而不是viewDidLoad中设置委托,我还尝试从不同的VC设置委托。
这是我的协议:
import Foundation
import Photos
protocol sideMenuDelegate {
func handleRowSelection(title: String, fetchResult: PHFetchResult<PHAsset>, assetCollection: PHAssetCollection?)
}
这就是我在第三个包含容器视图的VC中设置委托的方法:
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
sideMenuVC = storyboard.instantiateViewController(withIdentifier: "sideVC") as? SideMenuViewController
centerVC = storyboard.instantiateViewController(withIdentifier: "centerVC") as? centerViewController
sideMenuVC?.delegate = centerVC
我也试过在我的centerVC中设置它,如下所示:
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
sideMenuVC = storyboard.instantiateViewController(withIdentifier: "sideVC") as? SideMenuViewController
sideMenuVC?.delegate = self
最后这是委托函数的实现:
extension centerViewController: sideMenuDelegate {
func handleRowSelection(title: String, fetchResult: PHFetchResult<PHAsset>, assetCollection: PHAssetCollection?) {
pageTitle = title
inFetchResult = fetchResult
inAssetCollection = assetCollection
}
}
我认为问题是从故事板访问正确的VC实例,但我找不到任何方法来解决它。
我找到了解决方案。
使用容器视图时,获取对嵌入式VC的引用的正确方法是实现准备segue方法并访问包含容器视图的VC类中的目标属性;像这样:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "sideVCSeg" {
sideMenuVC = (segue.destination as! SideMenuViewController)
}
if segue.identifier == "centerVCSeg" {
let navController = (segue.destination as! UINavigationController)
centerVC = (navController.viewControllers.first as! centerViewController)
}
}
并且因为在加载视图时执行此方法我只需要将此行添加到viewDidLoad:
sideMenuVC?.delegate = centerVC