简体   繁体   English

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

[英]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. 我正在尝试从LoadingDataHelper对象调用函数updateProgress ,但是未调用我的委托。 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未连接到LoadingDataViewController (我的意思是像当您拥有UIViewviewController )。

LoadingDataHelper 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 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. 上面的代码L中有一些错误:在LoadingDataViewController中,您正在为LoadingDataHelper类创建静态属性, 并将委托设置为该类。 But you are call "loginUser" using direct call. 但是您使用直接调用来调用“ loginUser”。

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. 这将使您的控制器获得代表回叫。

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

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