使用容器视图时委托为零
Delegate is nil when using container views
我有 2 个容器视图,其中分别嵌入了一个 UITableViewController(sideMenuVC) 和一个 UICollectionViewController(centerVC),而我的 CollectionVC 在导航控制器本身中.我已将这两个容器视图放在第三个 VC 中,即根 VC。现在我正在尝试根据在 sideMenuVC 中选择的行在我的 centerVC 中显示内容并且我正在使用委托,但是,当我尝试从发件人。我已经尝试将委托设置为弱并且还在 awakeFromNib 中设置委托而不是 viewDidLoad,我还尝试从不同的 VCs.
设置委托
这是我的协议:
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
我也试过在我的中心设置它VC 像这样:
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
}
}
我认为问题在于从情节提要中访问 VCs 的正确实例,但我找不到任何方法来修复它。
我找到了解决办法。
使用容器视图时,获取对嵌入式 VC 的引用的正确方法是实施 Prepare for segue 方法并访问 VC 中的目标 属性 class 包含容器视图;像这样:
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
我有 2 个容器视图,其中分别嵌入了一个 UITableViewController(sideMenuVC) 和一个 UICollectionViewController(centerVC),而我的 CollectionVC 在导航控制器本身中.我已将这两个容器视图放在第三个 VC 中,即根 VC。现在我正在尝试根据在 sideMenuVC 中选择的行在我的 centerVC 中显示内容并且我正在使用委托,但是,当我尝试从发件人。我已经尝试将委托设置为弱并且还在 awakeFromNib 中设置委托而不是 viewDidLoad,我还尝试从不同的 VCs.
设置委托这是我的协议:
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
我也试过在我的中心设置它VC 像这样:
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
}
}
我认为问题在于从情节提要中访问 VCs 的正确实例,但我找不到任何方法来修复它。
我找到了解决办法。
使用容器视图时,获取对嵌入式 VC 的引用的正确方法是实施 Prepare for segue 方法并访问 VC 中的目标 属性 class 包含容器视图;像这样:
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