我正在通过swift ver从Amazon SNS向ios应用发送推送通知。 3.当推送通知到达时,应用程序将根据this SO线程切换到设备上的第二个标签栏项目。 MyGlobalVariables是一个在AppDelegate.swift中更新的结构,并在viewcontroller中读取。
AppDelegate.swift
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
if let aps = userInfo["aps"] as? NSDictionary {
if let alert = aps["alert"] as? NSDictionary {
if let title = alert["title"] as? String {
MyGlobalVariables.pushTitle = title
}
if let body = alert["body"] as? String {
MyGlobalVariables.pushBody = body
}
}
}
if self.window!.rootViewController as? UITabBarController != nil {
let tabbarController = self.window!.rootViewController as! UITabBarController
tabbarController.selectedIndex = 1
}
}
在SecondViewController.swift中,文本在viewWillAppear()中更新,一切正常。
override func viewWillAppear(_ animated: Bool) {
pushTitleLabel?.text = MyGlobalVariables.pushTitle
}
如果我在此标签中发送了具有不同标题的新推送通知,我希望更新文本标签,而无需导航和退回。
我试图通过将其添加到AppDelegate.swift来刷新文本标签。
let sVC = SecondViewController()
if let title = alert["title"] as? String {
MyGlobalVariables.pushTitle = title
sVC.updateLabel(t: title)
}
在SecondViewController.swift中有这个功能
func updateLabel(t: String) {
self.pushTitleLabel?.text = t
}
但是我仍然需要远离选项卡并再次返回以更新文本,viewWillAppear()负责处理。
答案 0 :(得分:1)
问题在于let sVC = SecondViewController()
创建了SecondViewController
的新实例,而不是对现有实例的引用。您应该使用tabBarController的viewControllers
属性来获取引用:
let sVC = tabbarController.viewControllers[1] as! SecondViewController
然后,您可以调用updateLabel
方法。