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