UserDefaults数组不断返回nil

时间:2017-12-21 01:20:34

标签: arrays swift nsuserdefaults

我有一个名为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()(请参阅下面的代码)并创建新标签,但不会读取或修改UserDefault。

以下是我用来保存邮件的功能:

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

而不是消息的内容?

1 个答案:

答案 0 :(得分:1)

由于选项为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可编码并将(单个)数据数组写入文件。所有这些都留给读者练习,因为它远远超出了原始问题的范围。