如何解决委托未从ViewController中的Singleton触发
我在一个单例中存储了priestArray。我已经定义了一个协议和一个委托。如果我创建一个类(而不是viewController),则在更改awardArray的值时,代理将按预期触发。但是,在我的viewController中,我无法解雇该委托。您能指出我做错了什么吗?预先非常感谢。
这是单例AppData类
import Foundation
protocol AppDataDelegate {
func didChange(_ prizeArray: Array<Prize>)
}
class AppData
{
static let shared = AppData()
var delegate: AppDataDelegate?
var parsedPrizes:[Prize] = []
private init() {}
func changeThis(newArray: [Prize]) {
parsedPrizes = newArray
print("AppData got parsedPrizes")
delegate?.didChange(newArray)
}
}
import UIKit
import CoreData
class GameBoard: FPBViewController,AppDataDelegate {
override func viewDidLoad() {
super.viewDidLoad()
AppData.shared.delegate = self
}
func didChange(_ prizeArray: Array<Prize>) {
print("data via the delegate prizeArray: \(prizeArray.count)")
}
}
解决方法
是否还有其他使用AppData
的单例委托的类?如果是这样,也许这就是原因...您可能将另一个ViewController
重新分配给该代表,而GameBoard
停止监听。
编辑; 为了能够通知多个类,您需要像这样保留这些类的多个实例:
import Foundation
protocol AppDataDelegate {
func didChange(_ prizeArray: Array<Prize>)
}
class AppData
{
static let shared = AppData()
var delegates: [AppDataDelegate] = [] <=========== notify every class that listens
var parsedPrizes:[Prize] = []
private init() {}
func changeThis(newArray: [Prize]) {
parsedPrizes = newArray
print("AppData got parsedPrizes")
delegates.forEach { delegate in <===========
delegate.didChange(newArray)
}
}
}
import UIKit
import CoreData
class GameBoard: FPBViewController,AppDataDelegate {
override func viewDidLoad() {
super.viewDidLoad()
AppData.shared.delegates.append(self) <===========
}
func didChange(_ prizeArray: Array<Prize>) {
print("data via the delegate prizeArray: \(prizeArray.count)")
}
@IBAction func closeVC(_ sender: Any) {
if let index = AppData.shared.delegates.firstIndex(where: { $0 === self }) {
AppData.shared.delegates.remove(at: index)
}
// -------------------------------------------
self.dismiss(animated: true,completion: nil)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。