Swift 代理未从viewcontroller中的单例触发

Swift 代理未从viewcontroller中的单例触发,swift,delegates,swift4,protocols,Swift,Delegates,Swift4,Protocols,我正在单例中存储prizeArray。我已经定义了一个协议和一个委托。如果我创建了一个类(而不是viewController),那么当我更改prizeArray的值时,代理将按预期激发。但是,在我的viewController中,我无法启动代理。你能指出我做错了什么吗?非常感谢 下面是singleton AppData类 import Foundation protocol AppDataDelegate { func didChange(_ prizeArray: Array<

我正在单例中存储prizeArray。我已经定义了一个协议和一个委托。如果我创建了一个类(而不是viewController),那么当我更改prizeArray的值时,代理将按预期激发。但是,在我的viewController中,我无法启动代理。你能指出我做错了什么吗?非常感谢

下面是singleton 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)")
    }
}



<代码>导入基础 协议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的实例从
数组中删除滚轮,然后将其取消。