UserDefaults 数组连续 returns 无

UserDefaults array continously returns nil

我有两个数组,名为 textMessagessendersMessages。 当我的视图加载时,我想读取这些数组并为每条消息创建一个新标签,并根据 sendersMessages.

中存储的值更改它的颜色

这是我的 ViewController 代码:

class ConversationViewController: UIViewController {

    ///UserDefaults
    let defaults = UserDefaults.standard

    override func viewDidLoad() {
        super.viewDidLoad()

        //Synchronise NSUserDefaults
        defaults.synchronize()

        //Load previous messages
        let nMessages: Int = defaults.integer(forKey: "numberOfMessages")
        let arrayOfMessages = defaults.array(forKey: "textMessages")
        let arrayOfSenders = defaults.array(forKey: "sendersMessages")

        var i = 1
        for i in 0...nMessages {
            let sender: String? = (arrayOfSenders?[i] as? String)
            let text: String? = (arrayOfMessages?[i] as? String)
            print("\(String(describing: sender)) sent the message: \(String(describing: text)) ; i = \(i)")
            if text != nil {
                if sender != nil {
                    displayNewMessage(text: text!, sentBy: sender!)
                }
            }
        }
    }
}

displayNewMessage() 函数调用 sendMessage()(见下面的代码)并创建一个新标签,但不读取或修改 UserDefaults。

这是我用来保存消息的函数:

func sendMessage(text: String, sentBy: String, time: Double){
    let defaults = UserDefaults.standard
    var n = defaults.integer(forKey: "numberOfMessages")
    var sentByArray = defaults.array(forKey: "sendersMessages")
    var textArray = defaults.array(forKey: "textMessages")

    sentByArray?.append(sentBy)
    textArray?.append(text)
    n = n + 1

    defaults.set(sentByArray, forKey: "sendersMessages")
    defaults.set(textArray, forKey: "textMessages")
    defaults.set(n, forKey: "numberOfMessages")

    //Synchronise NSUserDefaults
    defaults.synchronize()
}

如您所见,我使用了两个数组(一个用于存储发件人,另一个用于存储文本)和一个 Int 来了解发送了多少条消息。

有人可以向我解释为什么控制台打印以下内容

nil sent the message: nil ; i = 0
nil sent the message: nil ; i = 1
nil sent the message: nil ; i = 2
nil sent the message: nil ; i = 3
nil sent the message: nil ; i = 4
nil sent the message: nil ; i = 5
nil sent the message: nil ; i = 6
nil sent the message: nil ; i = 7
nil sent the message: nil ; i = 8
nil sent the message: nil ; i = 9
nil sent the message: nil ; i = 10

而不是消息的内容?

您的 sendMessage 代码从不为数组设置任何值,因为可选值是 nil

你需要:

func sendMessage(text: String, sentBy: String, time: Double){
    let defaults = UserDefaults.standard
    var n = defaults.integer(forKey: "numberOfMessages")
    var sentByArray = defaults.stringArray(forKey: "sendersMessages") ?? []
    var textArray = defaults.stringArray(forKey: "textMessages") ?? []

    sentByArray.append(sentBy)
    textArray.append(text)
    n = n + 1

    defaults.set(sentByArray, forKey: "sendersMessages")
    defaults.set(textArray, forKey: "textMessages")
    defaults.set(n, forKey: "numberOfMessages")
}

请注意,您不需要调用 synchronize,尤其是在读取 viewDidLoad 方法中的值之前。

你也应该更新 viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()

    //Load previous messages
    let nMessages: Int = defaults.integer(forKey: "numberOfMessages")
    let arrayOfMessages = defaults.stringArray(forKey: "textMessages") ?? []
    let arrayOfSenders = defaults.stringArray(forKey: "sendersMessages") ?? []

    for i in 0..<nMessages {
        let sender = arrayOfSenders[i]
        let text = arrayOfMessages[i]
        print("\(sender) sent the message: \(text) ; i = \(i)")
        displayNewMessage(text: text!, sentBy: sender!)
    }
}

而且您真的不需要存储消息的数量。只看数组中对象的数量。

需要考虑的其他事项 - UserDefaults 不是存储应用程序数据的地方。你应该有一个 struct 代表你的数据的每个实例。使 struct 可编码并将(单个)数据数组写入文件。所有这些都留作 reader 的练习,因为它远远超出了您最初问题的范围。