Делегат равен нулю при использовании представлений контейнера - PullRequest
0 голосов
/ 16 марта 2019

У меня есть 2 контейнерных представления, в которые встроены UITableViewController (sideMenuVC) и UICollectionViewController (centerVC) соответственно, и мой CollectionVC находится внутри самого контроллера навигации. Я поместил эти два контейнерных представления в третий виртуальный канал, который является корневым. Теперь я пытаюсь показать содержимое в моем centerVC на основе строки, выбранной в sideMenuVC, и я использую делегаты, однако, когда я пытаюсь вызвать его от отправителя, делегат равен нулю. Я попытался установить делегата как слабого, а также установить делегата в awakeFromNib вместо viewDidLoad, я также попытался установить делегата из разных VC.

Вот мой протокол:

import Foundation
import Photos

protocol sideMenuDelegate {
    func handleRowSelection(title: String, fetchResult: PHFetchResult<PHAsset>, assetCollection: PHAssetCollection?)
}

и вот как я устанавливаю делегата внутри третьего виртуального контейнера, который содержит оба представления контейнера:

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

Я также попытался установить его в моем центре ВК, например:

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 голосов
/ 17 марта 2019

Я нашел решение.

При использовании контейнерных представлений правильный способ получения ссылок на встроенные VC состоит в том, чтобы реализовать метод Prepare для 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
...