首页 > 解决方案 > Swift Delegate 在展开 Optional 值时意外返回 nil

问题描述

在协议中设置我的委托继续抛出零。我尝试了其他帖子中建议的多种方法。我试图让我的协议 + 委托启动并运行,但是无法解决为什么它继续抛出零。

强制展开,从文件中的不同位置调用委托,删除和添加弱变量。

列表显示:

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)

不成功。目前我只是想记录基本的打印语句。

标签: iosswiftdelegatesprotocols

解决方案


可能你的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()

    }
    ... 
}

要知道您的类是否被释放,请添加一个带有 print 语句的 deinit。

deinit {
    print("Deallocated")
}

推荐阅读