微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

委托未从ViewController中的Singleton触发

如何解决委托未从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 举报,一经查实,本站将立刻删除。