Swift App - Обновление нескольких ViewControllers в фоновом режиме - PullRequest
0 голосов
/ 08 января 2020

У меня проблема с обновлением фона моего приложения, когда оно не закрыто, и пользователь переходит к нему, пока оно еще открыто.

Это приложение дня с 4 Контроллеры представления (первый показывает слово, второй показывает определение и т. Д. c), каждый из которых соединен одной кнопкой и одним переходом, а затем выходит на 4-й V C. В настоящее время он работает как задумано и обновляет новое слово каждый календарный день , если приложение закрывается и открывается снова в новый день .

Если приложение не закрывается и новый календарный день как произошло, я все еще могу обновить sh только первый V C немедленно , чтобы показать новое слово, если пользователь возвращается к приложению. Кажется, я не могу переосмыслить sh других 3 V C, чтобы они сохраняли старые метки до перезапуска приложения. Можете ли вы просто добавить NotificationCenter.default.addObserver к каждому V C?

Испытывая различные варианты NotificationCenter.default.addObserver для других VC, я смог кратко обновить второй V C на долю секунды, если тот V C был тем, который был открыт, когда пользователь перемещался назад, используя кнопка домой или кнопка приложения. Я пытался исследовать эту проблему и не могу найти отличный ответ - что мне не хватает?

Main V C

import UIKit
import UserNotifications

// 31 total words, removed for simplification
let wordList = 
[
    Words(word: "aaaa", pronounciation: "bbbb", type: "noun", definition: "blah"),
    Words(word: "bbbb", pronounciation: "cccc", type: "adjective", definition: "blahb")  

]

// Global variables to pull in other VCs
let currentDay = Calendar.current.component(.day, from: Date())
let wordOfDay = wordList[currentDay - 1]

class ViewController: UIViewController {

    @IBOutlet weak var wordLabel: UILabel!
    @IBOutlet weak var pronounciationLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // local push notifications
        let center = UNUserNotificationCenter.current()
        let content = UNMutableNotificationContent()

        content.title = "Word of the Day"
        content.body = wordOfDay.word + " | " + wordOfDay.definition
        content.sound = UNNotificationSound.default
        content.threadIdentifier = "local-notifications temp"

        let date = Date()
        var dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date)

        dateComponents.hour = 10
        dateComponents.minute = 0
        dateComponents.second = 0

        let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)
        let request = UNNotificationRequest(identifier: "content", content: content, trigger: trigger)

        // refresh background and update new word
        NotificationCenter.default.addObserver(self, selector: #selector(self.applicationDidBecomeActive),
                   name: UIApplication.didBecomeActiveNotification, //
                   object: nil)

        center.add(request) { (error) in

            if error != nil {
                print(error)
            }
            }
    }
    @IBAction func prepareForUnwind (segue: UIStoryboardSegue){}


    @objc func applicationDidBecomeActive() {
        let currentDay = Calendar.current.component(.day, from: Date())
        let wordOfDay = wordList[currentDay - 1]

         wordLabel.text = wordOfDay.word
         pronounciationLabel.text = wordOfDay.pronounciation
    }

}

Вот второй V C.

import UIKit
import UserNotifications

class WordViewController: UIViewController {

    @IBOutlet weak var definitionLabel: UILabel!
    @IBOutlet weak var typeLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()


        definitionLabel.text = wordOfDay.definition
        typeLabel.text = wordOfDay.type

              NotificationCenter.default.addObserver(self, selector: #selector(self.applicationDidBecomeActive1),
                               name: UIApplication.didBecomeActiveNotification, //
                                object: nil)

           }

               @objc func applicationDidBecomeActive1() {
               let currentDay = Calendar.current.component(.day, from: Date())
               let wordOfDay = wordList[currentDay - 1]

               definitionLabel.text = wordOfDay.definition
                typeLabel.text = wordOfDay.type

Ответы [ 2 ]

0 голосов
/ 10 января 2020

И, как я уже сказал, в этом контексте не имеет смысла обновлять контроллеры, если пользователь не знает, что слово изменилось, это просто плохой UX

0 голосов
/ 08 января 2020

Не используйте singleton или NotificationCenter, нет необходимости сохранять остальную часть ViewControllers в памяти, когда вы находитесь в первом.

Что вам нужно сделать это воссоздать ваш initial view controller и установить основной контроллер вида windows root на этот. Тогда поток просто начнется снова, как будто пользователь только что открыл приложение.

Вы можете получить доступ к свойству window из объекта UIApplication.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...