Swift中UserDefaults值仅username可赋值tableView cell label问题求解
问题原因
最核心的错误是你在TableViewCell的setup方法中,连续两次给同一个label属性赋值,后执行的用户名赋值操作直接覆盖了之前的密码赋值结果,因此永远只能看到用户名展示。
同时你的setup方法参数设计冗余,传入的两个UDM参数完全没有被使用,属于无效代码。另外UserDefaults读写字符串时使用value(forKey:)属于KVC调用,不如原生专用API类型安全。
解决方案
步骤1:优化UDM工具类,添加便捷读取属性
class UDM { static let shared = UDM() let defaults = UserDefaults(suiteName: "saved.data") } // 新增扩展封装读写逻辑 extension UDM { var savedUsername: String? { // 使用专用的字符串读取API,类型更安全 defaults?.string(forKey: "username") } var savedPassword: String? { defaults?.string(forKey: "password") } }
你原有的存储代码不需要修改,可以正常使用。
步骤2:调整TableViewCell的定义和setup方法
首先确认你的cell内有两个独立的label分别展示用户名和密码,如果只有一个label需要拼接展示两个内容,可以按需调整:
class TableViewCell: UITableViewCell { // 提前定义两个展示用的label let usernameLabel = UILabel() let passwordLabel = UILabel() // 重构setup方法,直接接收需要展示的字符串值,不需要传整个UDM实例 func setup(username: String?, password: String?) { usernameLabel.text = username ?? "无用户名" passwordLabel.text = password ?? "无密码" // 如果只有一个label需要拼接展示,用下面的写法: // label.text = "用户名:\(username ?? "无") 密码:\(password ?? "无")" } }
步骤3:修改TableViewController的cellForRow方法
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath) as? TableViewCell else { return UITableViewCell() } // 直接传入读取到的两个值即可 cell.setup(username: UDM.shared.savedUsername, password: UDM.shared.savedPassword) return cell }
额外安全提示
密码属于用户敏感信息,绝对不要明文存储在UserDefaults中,UserDefaults会以明文plist的形式存储在应用沙盒中,很容易被提取获取,敏感信息请存储到系统Keychain中。
内容的提问来源于stack exchange,提问作者Nergezeev Alik
相关产品推荐
相关产品推荐

