Как правильно уведомить контроллер представления из 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.