更新标签栏viewcontroller中的文本标签

时间:2016-08-10 20:20:41

标签: ios iphone swift uiviewcontroller uitabbar

我正在通过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()负责处理。

1 个答案:

答案 0 :(得分:1)

问题在于let sVC = SecondViewController()创建了SecondViewController新实例,而不是对现有实例的引用。您应该使用tabBarController的viewControllers属性来获取引用:

let sVC = tabbarController.viewControllers[1] as! SecondViewController

然后,您可以调用updateLabel方法。