You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:00:03