从AppDelegate调用委托函数不起作用

时间:2017-08-06 16:36:13

标签: ios swift swift3 delegates

我试图在AppDelegate中调用委托函数,但似乎永远不会被调用。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate,appdelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        if let navigationController = window?.rootViewController, let
            viewController = navigationController.childViewControllers.first as? ViewController {
            viewController.delegate = self
        }
        // Override point for customization after application launch.
        return true
    }

    func callfromDelegte(indicator: UIActivityIndicatorView) {
        indicator.stopAnimating()
    }

的ViewController - :

import UIKit

protocol appdelegate:class {
    func callfromDelegte(indicator:UIActivityIndicatorView)
}
class ViewController: UIViewController {

    @IBOutlet weak var indicator: UIActivityIndicatorView!
   weak var delegate:appdelegate?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        indicator.startAnimating()
        indicator.hidesWhenStopped = true
    }

    @IBAction func rotateAction(_ sender: UIButton) {
        if delegate != nil{
        delegate?.callfromDelegte(indicator: indicator)
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

委托总是零,它永远不会进入内部功能。那是什么我不知道 现在关于代表呢? Google GIDSignInDelegate 及其委托函数如何从控制器类调用AppDelegate内部?我知道这可能是一个非常愚蠢的问题,但我仍然想知道。谢谢

好的,因为我没有使用navigationController嵌入我的控制器。因此,如果让,它不会进入。它的工作方式就像这样 - :

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
//        if let navigationController = window?.rootViewController, let
//            viewController = navigationController.childViewControllers.first as? ViewController {
//            viewController.delegate = self
//        }
        // Override point for customization after application launch.

        let controller = window?.rootViewController as! ViewController
        controller.delegate = self
        return true
    }

2 个答案:

答案 0 :(得分:1)

您无法直接创建delegate对象,并在app delegate内设置Viewcontroller。您需要首先访问rootViewController对象,因为它位于if let navigationController = window?.rootViewController, let viewController = navigationController.childViewControllers.first as? ViewController { viewController.delegate = self } 内部,因此您需要像这样实现

{{1}}

答案 1 :(得分:1)

您可以尝试从共享应用程序获取AppDelegate实例。希望它会有所帮助

这是Swift 3

@IBAction func rotateAction(_ sender: UIButton) {
        let delegate = UIApplication.shared.delegate as? AppDelegate

        delegate?.callfromDelegte(indicator: indicator)
}