Как я могу сохранить данные внутри TableView? - PullRequest
0 голосов
/ 02 ноября 2018

В моем приложении есть ярлык, который, когда пользователь нажимает на вид или трясет iPhone, меняет цитату случайным образом. Если пользователь дважды коснется того же представления, он должен сохранить кавычку внутри TableView. Сначала я думал, что смогу использовать CoreData, но он не работал. Теперь я использую UserDefaults, и теперь, если я дважды коснусь представления, цитата будет сохранена, но только по одному за раз. Я хочу, чтобы он создал список всех цитат, по которым пользователь дважды нажал.

Вот код внутри объекта doubleTap:

let savedQuotes = UserDefaults.standard.setValue(quoteLabel.text!, forKey: "saveQuotes")

    if let printSavedQuotes = UserDefaults.standard.string(forKey: "saveQuotes"){

        print(printSavedQuotes)

    }

А вот код, который я использовал внутри для TableVIew:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    _ = UserDefaults.standard.string(forKey: "saveQuotes")

    return 15

}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "QuoteCell", for: indexPath)

    if let printSavedQuotes = UserDefaults.standard.string(forKey: "saveQuotes"){

        cell.textLabel?.text = "\(printSavedQuotes)"

    }

Вот изображение проблемы.

Here's an image of the problem

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Попробуйте, как показано ниже:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    let savedQuotes = UserDefaults.standard.value(forKey: "saveQuotes") as? [String] ?? [String]()

    return saveQuotes.count

}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "QuoteCell", for: indexPath)

    let saveQuotes = UserDefaults.standard.value(forKey: "saveQuotes") as? [String] ?? [String]()

    cell.textLabel?.text = saveQuotes[indexPath.row]

    return cell
}

func saveQuote(){

    var saveQuotes = UserDefaults.standard.value(forKey: "saveQuotes") as? [String] ?? [String]()

    saveQuotes.append(quoteLabel.text!)

    UserDefaults.standard.set(saveQuotes, forKey: "saveQuotes")

    print(saveQuotes)
}

Это просто пример, рекомендуемый подход - использовать sqlite или core-data для хранения постоянных данных вместо UserDefaults.

0 голосов
/ 02 ноября 2018

Пожалуйста, узнайте о Collections в Swift. То, что вы ищете, типа Array. Тип, представляющий коллекцию элементов, хранящихся в определенном порядке.

Документация: https://developer.apple.com/documentation/swift/array

Теперь, когда вы научитесь сохранять вещи в массив, вы можете подключить этот массив к вашему tableView.

Самая базовая настройка:

var quotes: [String] = ["quote1", "quote2", "quote3"]

В numberOfRowsInSection вы вернетесь quotes.count

и cellForRow ваш cell.textLabel.text == quotes[indexPath.row]

...