Как правильно уведомить контроллер представления из AppDelegate?

Я зарегистрировал свое приложение, чтобы открыть файл определенного типа (в моем случае это cvs). Поэтому, когда пользователь нажимает "Открыть в -> Мое приложение"

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

функция срабатывает. В этой функции я читаю данные из файла в локальный массив. В моем View Controller мне нужно отобразить данные выше. Итак, как правильно уведомить ВК о том, что данные были получены, и передать данные в него?

3 ответа

Решение

Вам необходимо опубликовать уведомление, как это:

Где-то в вашем файле констант:

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)

В ViewDidLoad ViewController:

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
}

Приведенный выше ответ Алекса работает, если ваш контроллер представления, который обрабатывает уведомление, оказывается на экране при поступлении уведомления, но часто это не так. В

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

Вы хотите обновить количество значков, а затем проверить уведомление. В зависимости от того, какое у вас уведомление, вы либо обрабатываете его молча (возможно, используя метод Центра уведомлений, описанный выше), либо запускаете соответствующий контроллер представления и передаете ему все уведомление или только идентификатор, и контроллер представления вызывает ваш API с помощью идентификатор, чтобы получить все детали. Вы делаете это так же, как вы обычно меняете контроллеры представления, поэтому, если это контроллер навигации, вы создаете новый контроллер представления, передаете ему данные и затем помещаете его в контроллер навигации.

    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];
}

пусть серверная сторона отправит вам userInfo с указанными вами URL.

Другие вопросы по тегам