如何从viewController到appdelegate进行通讯?

时间:2019-12-20 03:22:17

标签: ios swift appdelegate

我想与我的appdelegate进行通信,换句话说,我想将许多视图中的数据发送到AppDelegate,这有可能吗?

我找到了此代码

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
这个问题的

Bi-Directional communication between ViewController and AppDelegate with swift 2 for iOS

可以使用NSNotification进行通信吗?

2 个答案:

答案 0 :(得分:2)

是的,Notification可以完成您想做的事情。在视图控制器中,发布通知:

class YourViewController: UIViewController {

    ...

    @IBAction func buttonPressed(_ sender: Any) {
        NotificationCenter.default.post(name: "ViewControllerButtonPressed", object: nil)
    }
}

然后,在您的AppDelegate内,添加一个Notification观察者以观察此通知名称的帖子:

class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        ...

        //Add the observer
        //This observer will call the "doSomething" function every time NotificationCenter.default.post(name: "ViewControllerButtonPressed", object: nil) is called
        NotificationCenter.default.addObserver(self, selector: #selector(doSomething), name: "ViewControllerButtonPressed", object: nil)
    }

    @objc func doSomething() {
        print("A button was pressed in one of your view controllers!")
    }

}

其他建议: 为简化起见,您可以扩展Notification.Name为名称创建静态String值:

public extension Notification.Name {
    static let ButtonPressed = Notification.Name("ViewControllerButtonPressed")
}

然后可以替换

NotificationCenter.default.post(name: "ViewControllerButtonPressed", object: nil)

NotificationCenter.default.post(name: NSNotification.Name.ButtonPressed, object: nil)

NotificationCenter.default.addObserver(self, selector: #selector(doSomething), name: "ViewControllerButtonPressed", object: nil)

NotificationCenter.default.addObserver(self, selector: #selector(doSomething), name: NSNotification.Name.ButtonPressed, object: nil)

实施上述方法是可选的,但可以防止在使用Notification时错别字引起问题。

答案 1 :(得分:1)

我不建议您使用NotificationCenter。它们有一些局限性。

  1. 在每个ViewController中,您必须使用post函数,并且在App Delegate中必须添加观察者。然后,只有您可以使用NotificationCenter的post方法。就像上面的大卫向您展示的一样。

  2. 如果必须从不同的视图控制器调用App Delegate的不同功能,则必须在App Delegate中添加不同的观察者。之后,您可以调用App委托的不同功能。

但是使用上面在问题中定义的方法。您不需要添加观察者。借助此实例,您可以调用任何应用程序委托方法。我给你看一个例子:-

 let appDelegate = UIApplication.shared.delegate as! AppDelegate

 @UIApplicationMain
 @objc class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?
var isUpdate: Bool = false

func setValuesOfAppDelegate() {
    print("123")
}

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    IQKeyboardManager.shared.enable = true

    if UserDefaults.standard.bool(forKey: UserDefaultKey.isAutoLogin) == false {
        startViewController()
    } else {
        goToRootViewAfterLogin()
    }

    AppUserDefaults.set(KEnglish, forKey: KSetLanguage)
    self.registerForPushNotifications(application)

    return true
  }
}

示例如何使用App委托实例中的App委托变量和函数。您可以看一下代码。

  1. 在第一个示例中,设置了来自ClassA的App Delegate变量。

  2. 在第二个示例中,可以从ClassB调用App Delegate的功能。

  3. 在第三个示例中,可以设置App Delegate Class变量的值,并可以同时访问该函数。

    class ClassA: UIViewController {
    
        //MARK:- View Life Cycle
        override func viewDidLoad() {
          super.viewDidLoad()
            appDelegate.isUpdate = true
        }
    }
    
    class ClassB: UIViewController {
    
         //MARK:- View Life Cycle
         override func viewDidLoad() {
           super.viewDidLoad()
            appDelegate.setValuesOfAppDelegate()
         }   
    }
    
    class ClassC: UIViewController {
    
         //MARK:- View Life Cycle
         override func viewDidLoad() {
           super.viewDidLoad()
            appDelegate.isUpdate = true
            appDelegate.setValuesOfAppDelegate()
        } 
     }