简体   繁体   中英

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

I'm trying to call the function updateProgress from a LoadingDataHelper object but my delegate is not being called. I think the problem is that this LoadingDataHelper is not connected to the LoadingDataViewController (I mean like when you're having a UIView and a viewController ).

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()
    }
}

Is there a way to solve this?

There is some wrong in above codeL: In LoadingDataViewController, you are creating static property for LoadingDataHelper class and setting delegate to that class. But you are call "loginUser" using direct call.

You need to change like below:

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()
    }
} 

This will make your controller to get delegate call back.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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