Swift 代理未从viewcontroller中的单例触发
我正在单例中存储prizeArray。我已经定义了一个协议和一个委托。如果我创建了一个类(而不是viewController),那么当我更改prizeArray的值时,代理将按预期激发。但是,在我的viewController中,我无法启动代理。你能指出我做错了什么吗?非常感谢 下面是singleton AppData类Swift 代理未从viewcontroller中的单例触发,swift,delegates,swift4,protocols,Swift,Delegates,Swift4,Protocols,我正在单例中存储prizeArray。我已经定义了一个协议和一个委托。如果我创建了一个类(而不是viewController),那么当我更改prizeArray的值时,代理将按预期激发。但是,在我的viewController中,我无法启动代理。你能指出我做错了什么吗?非常感谢 下面是singleton AppData类 import Foundation protocol AppDataDelegate { func didChange(_ prizeArray: Array<
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)")
}
}
<代码>导入基础
协议AppDataDelegate{
func didChange(uzearray:Array)
}
类AppData
{
静态let shared=AppData()
变量委托:AppDataDelegate?
var parsedPrizes:[Prize]=[]
私有init(){}
func changeThis(newArray:[Prize]){
parsedPrizes=newArray
打印(“AppData已解析”)
委托?.didChange(新数组)
}
}
导入UIKit
导入CoreData
类游戏板:FPBViewController、AppDataDelegate{
重写func viewDidLoad(){
super.viewDidLoad()
AppData.shared.delegate=self
}
func didChange(uzearray:Array){
打印(“通过委托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)
}
}
<代码>导入基础
协议AppDataDelegate{
func didChange(uzearray:Array)
}
类AppData
{
静态let shared=AppData()
var委托:[AppDataDelegate]=[]谢谢。这就是问题所在。我可以让一个以上的ViewController侦听该委托吗?当然可以!只需创建一个
AppDataDelegate
数组,就像这样;var委托:[AppDataDelegate]=[]
我认为你的意思是在Singleton中。但是如果我这样做了,那么这个函数的更改就会中断。你能给我举个例子吗?谢谢。这很有意义,因为你可能不会在vc实例解散时删除它。我更新了我的答案。我添加了closeVC
按钮操作,它会删除当前ViewCont的实例从数组中删除滚轮,然后将其取消。