在UITableView上使用UserDefaults

时间:2017-01-08 17:50:09

标签: ios swift

我制作了一款使用Blogger API的应用。在第一个标签中,我可以搜索帖子并显示其内容。另外,我可以将帖子添加到"收藏夹"第二个选项卡中的部分。一切正常,直到我关闭应用程序。重新启动后,“收藏夹”部分消失了。我试图实现UserDefaults,以便在杀死应用程序后收藏夹部分不会变空,但它不起作用。

这是将帖子添加到收藏夹的按钮代码:

vc.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTapped))

func addTapped() {
    offlineTitles.append(cellText)
    titlesArray.append(cellText)
    subtitlesArray.append(cellSubtitle)
    let defaults = UserDefaults.standard
    defaults.set(titlesArray, forKey: "title")
    defaults.set(subtitlesArray, forKey: "subtitle")
    NotificationCenter.default.post(name: .reload, object: nil)
    let ac = UIAlertController(title: "Added!", message: "Post added to favorites", preferredStyle: .alert)
    ac.addAction(UIAlertAction(title: "Great!", style: .default))
    present(ac, animated: true)
}

和这对于FavoritesViewController.swift:

import UIKit

var offlineTitles = [String]()
var titlesArray = [String]()
var subtitlesArray = [String]()


extension Notification.Name {
static let reload = Notification.Name("reload")
}

class OfflineViewController: UITableViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(reloadTableData(_:)), name: .reload, object: nil)
    self.tableView.allowsMultipleSelectionDuringEditing = false
}

func reloadTableData(_ notification: Notification) {
    self.tableView.reloadData()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return titlesArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "OfflineCell", for: indexPath)
    let defaults = UserDefaults.standard
    let userDefaultsTitleArray = defaults.array(forKey: "title") as? [String] ?? [String]()
    let userDefaultsSubtitleArray = defaults.array(forKey: "subtitle") as? [String] ?? [String]()
    let title = userDefaultsTitleArray[indexPath.row]
    let subtitle = userDefaultsSubtitleArray[indexPath.row]
    cell.textLabel?.text = title
    cell.detailTextLabel?.text = subtitle
    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let vc = FavouritesViewController()
    navigationController?.pushViewController(vc, animated: true)
}

override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return true
}

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == UITableViewCellEditingStyle.delete {
        offlineTitles.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
    }
}
}

1 个答案:

答案 0 :(得分:0)

您似乎正在cellForRowAt中阅读用户默认设置。这不仅效率低下(如果您有五个收藏夹,您将在五次读取它),但是时间错误。例如,numberOfRowsInSection将返回什么?当被调用时,您还没有将用户默认值读入数组。

您应该在viewDidLoad(以及可能还在reloadTableData中)的数组中读取用户默认值。