У меня есть простое приложение, которое обновляет UILabel, когда пользователь нажимает на локальное push-уведомление. В симуляторе, когда я нажимаю на уведомление, вызывается applicationDidBecomeActive, и в этом у меня есть общий объект, ссылающийся на класс контроллера представления. Затем я вызываю функцию в этом классе, которая получает новую строку и устанавливает UILabel для указанной строки.
Это работает все время в симуляторе, но когда я загружаю приложение на свое устройство, оно работает пару раз, а затем останавливается.
Я знаю, что устройство обновляет строковое значение, потому что когда я переключаюсь на другое представление в приложении и переключаюсь обратно, UILabel теперь показывает правильно обновленное значение, но не при возврате из уведомления.
Кто-нибудь еще имел эту проблему, когда симулятор и физическое устройство ведут себя по-разному?
В соответствии с запросом приведен код, который, надеюсь, поможет:
Это из файла appDelagate.swift
func applicationDidBecomeActive(_ application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
fetchCurrentUnQuoteFromViewController()
print("applicationDidBecomeActive has finished running.")
}
//Custom functions for the delagate
func setDefaultToTrue() {
readyForNewUnQuote = true
defaults.setValue(readyForNewUnQuote, forKey: "readyForNewUnQuote")
}
func fetchCurrentUnQuoteFromViewController() {
let quoteViewController:QuoteViewController = window!.rootViewController as! QuoteViewController
quoteViewController.getRandomGradient()
quoteViewController.fetchRandomUnQuote()
}
В моем контроллере представления есть функции, которые вызываются из appDelagate
func getRandomGradient() {
let randomNumber: Int = Int.random(in: 0 ... gradientArray.count - 1)
QuoteGradient.image = UIImage(named: gradientArray[randomNumber])
}
func updateUI() {
unQuoteLabel.text = defaults.string(forKey: "currentQuote")
}
Редактировать: я в основном добавил viewController.viewDidLoad () в качестве дополнительного вызова, и это, похоже, работает. Это плохой звонок? Это похоже на хакерский способ исправить ситуацию.
Хорошо, я думаю, что сузил это еще больше. У меня есть второй вид, который я пытаюсь использовать для страницы настроек. Если я просто продолжу первый просмотр с текстом цитаты, то при появлении уведомления я могу нажать на него, и он обновится до нового установленного текста.
Однако, если я перехожу к представлению настроек, а затем возвращаюсь к представлению цитаты, тогда, когда я нажимаю на уведомление, оно не обновляет текст, пока я не вернусь на страницу настроек и затем снова вернусь на страницу цитаты.
Я довольно новичок в разработке для iOS и не знаю, действительно ли переход к новому представлению что-то делает с общим объектом, который я создаю, или если он делает что-то еще, о чем я не знаю.
Редактировать 2: вот функция, которая срабатывает, когда пользователь нажимает на уведомление:
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
setDefaultToTrue()
print(defaults.value(forKey: "readyForNewUnQuote") ?? "Error")
fetchCurrentUnQuoteFromViewController()
print("response from notification was fired.")
completionHandler()
}