Ios Swift委托在展开可选值时意外返回find nil
在协议中设置我的代理继续抛出零。我尝试过其他帖子中建议的许多方法。我正试图让我的protocol+委托启动并运行,但是,无法解决为什么它继续抛出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 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中时,它会在离开该视图时打印。