Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift委托在展开可选值时意外返回find nil_Ios_Swift_Delegates_Protocols - Fatal编程技术网

Ios Swift委托在展开可选值时意外返回find nil

Ios Swift委托在展开可选值时意外返回find nil,ios,swift,delegates,protocols,Ios,Swift,Delegates,Protocols,在协议中设置我的代理继续抛出零。我尝试过其他帖子中建议的许多方法。我正试图让我的protocol+委托启动并运行,但是,无法解决为什么它继续抛出nil 强制展开、从文件中的不同位置调用委托、删除和添加弱变量 列表视图: protocol MixPlayer : class { func playMix(message: String) } class IssueViewController: UIViewController { @IBOutlet weak var iss

在协议中设置我的代理继续抛出零。我尝试过其他帖子中建议的许多方法。我正试图让我的protocol+委托启动并运行,但是,无法解决为什么它继续抛出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
中的
secondVC
被释放。将该属性设置为
视图控制器中的属性

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")
}

可能您的
ViewController
中的
secondVC
被解除分配。将该属性设置为
视图控制器中的属性

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")
}

哪一行崩溃?在
ViewController viewdiload
中,您的
secondVC
viewdiload
结束时被释放。您需要在屏幕上的
IssueViewController
的实际实例上设置委托,而不是您刚刚创建的实例(并且几乎立即释放)。如何从
ViewController
访问
IssueViewController
?@rmaddy在mixDelegate上崩溃?.playMix调用--我试图从ViewController打印deinit,但未记录任何结果。谢谢你的帮助。它不会像写的那样崩溃,因为你没有使用
mixDelegate?.playMix(消息:url)强制展开任何可选文件
除非
url
是一个隐式展开的可选项且为零。哪一行正在崩溃?在
ViewController viewdiload
中,您的
secondVC
viewdiload
末尾被释放。您需要在屏幕上的
IssueViewController
的实际实例上设置委托,不是一个您刚刚创建的实例(并且几乎立即发布)。如何从
ViewController
访问
IssueViewController
?@rmaddy在mixDelegate上崩溃?.playMix调用--我试图从ViewController打印deinit,但未记录任何结果。感谢您的帮助。它不会像写的那样崩溃,因为您没有使用
mixDelegate?强制展开任何可选项。playMix(message:url)
除非
url
是一个隐式展开的可选项,并且为零。谢谢,尝试更新时运气不佳。Denit不会从Viewcontroller调用,但当我将其放置在IssueViewController中时,它会在离开该视图时打印出来。谢谢,尝试更新时运气不佳。Denit不会从Viewcontroller调用,但当我将其放置在IssueViewController中时,它会在离开该视图时打印。