【问题标题】:Swift Delegate returns unexpectedly found nil while unwrapping an Optional valueSwift Delegate 在展开 Optional 值时意外返回 nil
【发布时间】:2019-09-23 02:31:10
【问题描述】:

在协议中设置我的委托继续抛出 nil。我尝试了其他帖子中建议的多种方法。我正在尝试让我的协议 + 委托启动并运行,但是无法解决为什么它继续抛出 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)

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

【问题讨论】:

  • 哪一行崩溃了?
  • ViewController viewDidLoad 中,您的secondVCviewDidLoad 结束时被释放。
  • 您需要在屏幕上的IssueViewController 的实际实例上设置委托,而不是您刚刚创建的实例(并且几乎立即发布)。你如何从ViewControllerIssueViewController
  • @rmaddy 在 mixDelegate?.playMix 调用时崩溃——我试图从 ViewController 打印 deinit 并且没有记录任何结果。感谢您的帮助。
  • 它不会像所写的那样在该行崩溃,因为您没有使用 mixDelegate?.playMix(message: url) 强制解包任何可选项,除非 url 是隐式解包的可选项并且它为 nil。

标签: ios swift delegates protocols


【解决方案1】:

ViewController 中的 secondVC 可能会被释放。将其设为您的 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")
}

【讨论】:

  • 谢谢,尝试更新但没有成功。 deinit 不会从 Viewcontroller 调用,但是当我放置在 IssueViewController 中时,它会在离开该视图时打印。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
相关资源
最近更新 更多