Swift Delegate возвращает неожиданно найденный ноль при развертывании необязательного значения - PullRequest
0 голосов
/ 05 мая 2019

Настройка моего делегата в протоколе продолжает сбрасывать ноль.Я пробовал многочисленные подходы, предложенные в других постах.Я пытаюсь запустить и запустить мой протокол + делегат, однако не могу решить, почему он продолжает выбрасывать nil.

Принудительное развертывание, вызов делегата из различных мест в файле, удаление и добавление Weak Var.

Просмотр списка:

protocol MixPlayer : class {
    func playMix(message: String)
}


class IssueViewController: UIViewController {

    @IBOutlet weak var issueCollection: UICollectionView!
    @IBOutlet weak var issueImage: UIImageView!

    var viewController: ViewController?

    var collectionViewtitle: String?
    var mixImageName: String?

    var mixList: [[String: String]]!

    weak var mixDelegate: MixPlayer?

    override func viewDidLoad() {
        super.viewDidLoad()

        issueCollection.dataSource = self
        issueCollection.delegate = self

    }

}
....

extension IssueViewController: UICollectionViewDelegate, UICollectionViewDataSource {

....

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        if let url = mixList[indexPath.row]["url"] {
            mixDelegate?.playMix(message: url)
        }
    }   
}

Контроллер представления:

import UIKit

class ViewController: UIViewController  {
    @IBOutlet weak var mainContainer: UIView!
    @IBOutlet weak var playerEmbedView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let secondVC = IssueViewController()
        secondVC.mixDelegate = self

    }
}

extension ViewController: MixPlayer {
    func playMix(message: String) {
        print(message)
    }
}

Любая попытка вызова

mixDelegate?.playMix(message: url)

не удалась.В настоящее время я просто пытаюсь записать основные операторы печати. ​​

1 Ответ

0 голосов
/ 05 мая 2019

Возможно, ваш secondVC внутри ViewController освобожден.Сделайте это свойством в ViewController.

class ViewController: UIViewController  {
    @IBOutlet weak var mainContainer: UIView!
    @IBOutlet weak var playerEmbedView: UIView!

    lazy var secondVC: IssueViewController = {
        let secondVC = IssueViewController()
        secondVC.mixDelegate = self
        return secondVC
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

    }
    ... 
}

Чтобы узнать, освобожден ли ваш класс, добавьте deinit с оператором print.

deinit {
    print("Deallocated")
}
...