繁体   English   中英

从AppDelegate通知视图控制器的正确方法是什么?

[英]What is correct way to notify view controller from AppDelegate?

我注册了我的应用程序以打开特定的文件类型(在我的情况下为cvs)。 所以当用户触摸“打开 - >我的应用程序”时

application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:])

功能被触发。 在这个函数中,我从文件读取数据到本地数组。 在我的View Controller中,我需要显示上面的数据。 那么通知VC接收数据并将数据传递给它的正确方法是什么?

你需要发布这样的通知:

在Constants文件中的某个位置:

extension Notification.Name {
    public static let myNotificationKey = Notification.Name(rawValue: "myNotificationKey")
}

在AppDelegate中:

let userInfo = [ "text" : "test" ] //optional
NotificationCenter.default.post(name: .myNotificationKey, object: nil, userInfo: userInfo)

在ViewController的viewDidLoad中:

NotificationCenter.default.addObserver(self, selector: #selector(self.notificationReceived(_:)), name: Notification.Name.myNotificationKey, object: nil)

视图控制器中的回调:

func notificationReceived(_ notification: Notification) {
    //getting some data from userInfo is optional
    guard let text = notification.userInfo?["text"] as? String else { return } 
    //your code here
}

Alex的上述答案是有效的,如果处理通知的视图控制器恰好在通知进入时屏幕上,但通常不是。

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any])

您想更新徽章计数,然后检查通知。 根据您拥有的通知类型,您可以静默处理它(可能使用上面的Notification Center方法),也可以启动相应的视图控制器并将整个通知传递给它或只传递ID,并让视图控制器调用您的API id获取所有细节。 您可以像通常更改视图控制器一样执行此操作,因此如果是导航控制器,则实例化新视图控制器,将数据传递给导航控制器,然后将其推送到导航控制器。

    let notificationTableViewController = UIStoryboard(name: Identifiers.Storyboard.Notification, bundle: nil).instantiateViewController(withIdentifier: String(describing: NotificationTableViewController.self)) as!
    NotificationTableViewController
    controller.notificationId = notificationId
    rootNavigationController?.pushViewController(notificationTableViewController, animated: true)

如果您有标签栏应用程序,则首先切换标签。 如果您有某种自定义导航,则需要在容器类上调用适当的方法。

不需要使用通知。 你的应用程序将是一团糟。

JLRoutes可以帮到你! 请参阅github页面中的示例。

在您的应用中定义一些URL,就像xxxDetail,xxxList和JLRoutes一样。 application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:])被调用时。 你只需要调用[JLRoutes route: URL]

您也可以以相同的方式处理didReceiveRemoteNotification

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
 // get URL from userInfo
 // [JLRoutes route: url];
}

让服务器端向您发送带有您定义的URL的userInfo。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM