使用容器视图时,代表为零

时间:2019-03-16 20:17:41

标签: ios swift delegates containers container-view

我有2个容器视图,分别在其中嵌入了UITableViewController(sideMenuVC)和UICollectionViewController(centerVC),而我的CollectionVC在导航控制器本身内部。我已经将这两个容器视图放入第三个VC(即rootVC)中。现在,我试图根据在sideMenuVC中选择的行在我的centerVC中显示内容,并且我正在使用委托,但是当我尝试从发送者调用它时,委托为nil。我尝试将委托设置为弱,并在aakeakeFromNib中设置委托,而不是在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

最后这是委托func的实现:

extension centerViewController: sideMenuDelegate {
    func handleRowSelection(title: String, fetchResult: PHFetchResult<PHAsset>, assetCollection: PHAssetCollection?) {
        pageTitle = title
        inFetchResult = fetchResult
        inAssetCollection = assetCollection
    }  
}

我认为问题在于从情节提要中访问VC的正确实例,但是我找不到任何解决方法。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。

使用容器视图时,获取对嵌入式VC的引用的正确方法是实现Prepare for segue方法并访问包含容器视图的VC类内的destination属性;像这样:

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