我制作了一款使用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)
}
}
}
答案 0 :(得分:0)
您似乎正在cellForRowAt
中阅读用户默认设置。这不仅效率低下(如果您有五个收藏夹,您将在五次读取它),但是时间错误。例如,numberOfRowsInSection
将返回什么?当被调用时,您还没有将用户默认值读入数组。
您应该在viewDidLoad
(以及可能还在reloadTableData
中)的数组中读取用户默认值。