我想与我的appdelegate进行通信,换句话说,我想将许多视图中的数据发送到AppDelegate,这有可能吗?
我找到了此代码
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
这个问题的: Bi-Directional communication between ViewController and AppDelegate with swift 2 for iOS
可以使用NSNotification进行通信吗?
答案 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。它们有一些局限性。
在每个ViewController中,您必须使用post函数,并且在App Delegate中必须添加观察者。然后,只有您可以使用NotificationCenter的post方法。就像上面的大卫向您展示的一样。
如果必须从不同的视图控制器调用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委托变量和函数。您可以看一下代码。
在第一个示例中,设置了来自ClassA的App Delegate变量。
在第二个示例中,可以从ClassB调用App Delegate的功能。
在第三个示例中,可以设置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()
}
}