iOS Приложение - Обновление массива строк для каждого нового дня - PullRequest
0 голосов
/ 07 января 2020

Я работаю над сайд-проектом на swift, который, по сути, является словом «приложение дня». Я сохранил 30 слов и контент в массив и пытался обновить слово каждый день. Я пробовал несколько исправлений, но безрезультатно. Я могу получить только первый отображаемый массив, даже если я изменю дату на своем телефоне.

Конфликтуют ли wordNumber и wordOfDay? Как я могу приспособить это так, чтобы новое слово появлялось каждый день?

let wordList =
[
    Words(word: "aaa", pronounciation: "bbbb", type: "noun", definition:"blah"),
    Words(word: "bbb", pronounciation: "cccc", type: "adjective", definition:"blah")
]

var wordNumber = 0;


class ViewController: UIViewController {

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

    override func viewDidLoad() {
        super.viewDidLoad()

        updateWord()
    }

    @IBAction func prepareForUnwind (segue: UIStoryboardSegue){}

    func updateWord()
    {
        let date = Date()
        let dateIndex = Int(date.timeIntervalSince1970) / (60*60*24)
        let wordOfDay = wordList[dateIndex % wordList.count]


        wordLabel.text = wordList[wordNumber].word
        pronounciationLabel.text = wordList[wordNumber].pronounciation

    }

}

Ответы [ 4 ]

3 голосов
/ 07 января 2020

Самый простой способ - получить индекс текущего дня из Calendar.

Поскольку день месяца начинается с 1, а индексы массива начинаются с нуля, необходимо уменьшить значение. Учтите, что у пары месяцев есть 31 день.

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

    wordLabel.text = wordList[wordNumber].word
    pronounciationLabel.text = wordList[wordNumber].pronounciation
}

Однако, если вам нужно случайное слово один раз каждый день, вам нужно сохранить номер текущего дня и текущий случайный индекс в UserDefaults. Загрузите его в viewDidLoad и сравните день с текущим значением. Если оба значения равны, получите слово по сохраненному индексу. Если они не равны, получите случайное число от 1 до 31 и сохраните номер текущего дня и индекс.

2 голосов
/ 07 января 2020

Я бы сказал, храните 31 значение в вашем массиве, так как может быть максимум 31 день. Затем, согласно текущему дню, покажите свое слово дня.

func updateWord() {
  let currentDay = Calendar.current.component(.day, from: Date()) // this would return the current day in Int, like today is 8th Jan, so it would return 8
  let wordOfDay = wordList[currentDay-1] // -1 because array index starts from 0 
  wordLabel.text = wordOfDay.word
  pronounciationLabel.text = wordOfDay.pronounciation
}
1 голос
/ 07 января 2020

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

Один из способов решения этой проблемы может быть, чтобы запустить таймер в viewDidLoad(), либо повторять через короткий интервал, либо повторять каждые 24 часа, начиная с полуночи.

Другой способ может заключаться в проверке даты и представлении нового слова только тогда, когда пользователь открывает / активирует / переключается обратно в приложение. Это может быть сделано путем добавления наблюдателя, например:

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

или следующим образом, если ваше приложение имеет UIWindowSceneDelegate:

if #available(iOS 13.0, *) {
    NotificationCenter.default.addObserver(self, selector: #selector(didBecomeActive), name: UIScene.didActivateNotification, object: nil)
} else {
    NotificationCenter.default.addObserver(self, selector: #selector(didBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil)
}

Внутри вашей функции didBecomeActive (или эквивалент) вы можете проверить дату и получить другое случайное слово.

1 голос
/ 07 января 2020

Я бы попробовал пару вещей:

Если нет конкретной c причины, по которой вы вручную вычисляете dateIndex, используйте:

let calendar = Calendar.current
calendar.component(.day, from: Date()) 

Где calendar.component(.day, from: Date()) возвращает Int

Кроме того, я вижу, что wordList имеет только два значения. Возможно, отправляемый вами индекс даты находится вне диапазона wordList. Чтобы проверить это, попробуйте ввести вручную, как показано ниже. Это должно работать, если проблема с индексом массива.

wordLabel.text = wordList[0].word

Наконец, для удобства чтения может иметь смысл сделать что-то вроде:

let firstWord = Words(word: "aaa", pronounciation: "bbbb", type: "noun", definition:"blah")
let secondWord = Words()
let wordList =
[
    firstWord, secondWord, etc.
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...