0

我有 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 实例,但我找不到任何解决方法。

4

1 回答 1

0

我找到了解决方案。

使用容器视图时,获取对嵌入式 VC 的引用的正确方法是实现 Prepare for 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
于 2019-03-16T22:53:37.273 回答