繁体   English   中英

Swift-未调用其他视图控制器中的函数(协议/委托)

[英]Swift - Function in other view controller is not being called (protocol / delegate)

我正在尝试从LoadingDataHelper对象调用函数updateProgress ,但是未调用我的委托。 我认为问题在于此LoadingDataHelper未连接到LoadingDataViewController (我的意思是像当您拥有UIViewviewController )。

LoadingDataHelper

protocol LoadingNewDataDelegate: class {
    func updateProgress(progress : Float)
}

class LoadingDataHelper: NSObject {
    var delegate: LoadingNewDataDelegate?
    static let shared = LoadingDataHelper() // shared instance

    func loginUser() {
    //more code
        updateProgressInViewController()
    //more code
    }

    func updateProgressInViewController() {
        delegate?.updateProgress(0.3)
    }

}

LoadingDataViewController

class LoadingDataViewController: UIViewController, LoadingNewDataDelegate {

let loadingDataHelper: LoadingDataHelper = LoadingDataHelper()

    override func viewDidLoad() {
        super.viewDidLoad()
        loadingDataHelper.delegate = self
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        if (NSUserDefaults.standardUserDefaults().boolForKey("approvedTermsOfUse")) {
            self.updateProgress(0.1)
            LoadingDataHelper.shared.loginUser()
        } else {
            self.askForTerms()
        }
    }

    func updateProgress(progress : Float) {
        self.progressBar.setProgress(progress, animated: true)
        self.progressBar.setNeedsDisplay()
    }
}

有办法解决吗?

上面的代码L中有一些错误:在LoadingDataViewController中,您正在为LoadingDataHelper类创建静态属性, 并将委托设置为该类。 但是您使用直接调用来调用“ loginUser”。

您需要进行如下更改:

class LoadingDataViewController: UIViewController, LoadingNewDataDelegate {    
**//Change to shared initialisation of object//**
let loadingDataHelper: LoadingDataHelper = LoadingDataHelper.shared

    override func viewDidLoad() {
        super.viewDidLoad()
        loadingDataHelper.delegate = self
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        if (NSUserDefaults.standardUserDefaults().boolForKey("approvedTermsOfUse")) {
            self.updateProgress(0.1)
           **//Call using static object instead of new instance or direct call//**
            loadingDataHelper.loginUser()
        } else {
            self.askForTerms()
        }
    }

    func updateProgress(progress : Float) {
        self.progressBar.setProgress(progress, animated: true)
        self.progressBar.setNeedsDisplay()
    }
} 

这将使您的控制器获得代表回叫。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM