UserDefaults with Struct - TableView 不显示从 UserDefaults 保存的数据?
Posted
技术标签:
【中文标题】UserDefaults with Struct - TableView 不显示从 UserDefaults 保存的数据?【英文标题】:UserDefaults with Struct - TableView not displaying data saved from UserDefaults? 【发布时间】:2021-04-12 02:00:25 【问题描述】:我在下面的表格视图单元格中显示数据时遇到问题是代码。
这是我第一次和最后一次设置的结构。
struct Person: Codable
var firstName: String
var lastName: String
这是我保存数据的视图控制器。
class viewController: UIViewController
var newPerson = [Person]()
override func viewDidLoad()
let person = [Person(firstName: "Peterson", lastName: "Jota") , Person(firstName: "John", lastName: "Paul")]
let encoder = JSONEncoder()
if let encoded = try? encoder.encode(person)
UserDefaults.standard.set(encoded, forKey: "savedPerson")
这是我试图加载数据的地方
class SeconClass: UITableViewController
var person = [Person]()
override func viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
if let savedPerson = defaults.object(forKey: "one") as? Data
let decoder = JSONDecoder()
if let loadedOne = try? decoder.decode(Person.self, from: savedPerson)
self.person = UserDefaults.standard.object(forKey: "savedPerson")
func tableView( tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return person.count
func tableView( tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "cellID", for: indexPath) as! UITableViewCell
cell.textLabel?.text = person[indexPath.row]
return cell
【问题讨论】:
您至少应该解释一下,让我们了解问题所在和情况。另外,请确保您的代码在 ` ` 中,以便将其突出显示为代码,以便我们阅读 如何从 userDefault 中检索人员数据,请添加代码 您的tableView
的dataSource
设置了吗?您没有使用 UITableViewController
并且您的 tableView 数据源方法在您的 viewController
类之外
是的,我做到了。问题是我无法在表格视图单元格中显示人员数据
解码数据后调用tableView.reloadData()
。
【参考方案1】:
首先不要使用UserDefaults
在控制器之间传递数据。这是非常糟糕的做法。
错误很明显:
您正在对数组进行编码,但对单个对象进行解码。 您在UserDefaults
中使用了不匹配的不同键。
我建议对所有键使用自定义结构。这样可以避免不匹配,因为代码完成会帮助您
struct Key
static let savedPeople = "savedPeople"
并以大写字母开头的类命名,并为数组使用一个不易混淆的名称 (people
)
class ViewController: UIViewController
var people = [Person]()
override func viewDidLoad()
people = [Person(firstName: "Peterson", lastName: "Jota") , Person(firstName: "John", lastName: "Paul")]
let encoder = JSONEncoder()
if let encoded = try? encoder.encode(people)
UserDefaults.standard.set(encoded, forKey: Key.savedPeople)
在第二个视图控制器catch
中存在潜在错误,UserDefaults
中存在data(forKey
。而在UITableViewController
dataSource
和delegate
默认连接。
class SeconClass: UITableViewController
var people = [Person]()
override func viewDidLoad()
// tableView.delegate = self
// tableView.dataSource = self
if let personData = defaults.data(forKey: Key.savedPeople)
do
self.people = try JSONDecoder().decode([Person].self, from: personData)
catch
print(error)
...
【讨论】:
【参考方案2】:看看这个,它对我有用...
var dataArray = [String]()
//Save the data...
dataArray.append(ChatID)
UserDefaults.standard.setValue(dataArray, forKey: "ChatIDArray")
//Retrive the data...
if let chatdataArr = UserDefaults.standard.value(forKey: "ChatIDArray") as? [String]
let trueCount = chatdataArr.filter $0 == chatID .count
print(trueCount)
if trueCount == 0
cell.Countlblref.isHidden = true
else
cell.Countlblref.isHidden = false
cell.Countlblref.text = "\(trueCount)"
【讨论】:
以上是关于UserDefaults with Struct - TableView 不显示从 UserDefaults 保存的数据?的主要内容,如果未能解决你的问题,请参考以下文章
将 Codable 保存到 UserDefaults 并匹配 NSCoding 的外观
Swift 3.0:在 TableView 的 UserDefaults 中存储数组
C++ Boost::Interprocess Shared memory with struct
P/Invoke Struct with Pointers, C++ from C#