Arrays UserDefaults数组连续返回nil

Arrays UserDefaults数组连续返回nil,arrays,swift,nsuserdefaults,Arrays,Swift,Nsuserdefaults,我有两个数组,分别名为textMessages和sendersMessages。 加载视图时,我希望读取这些数组并为每条消息创建一个新标签,并根据存储在sendersMessages中的值更改其颜色 以下是我的ViewController代码: class ConversationViewController: UIViewController { ///UserDefaults let defaults = UserDefaults.standard overrid

我有两个数组,分别名为
textMessages
sendersMessages
。 加载视图时,我希望读取这些数组并为每条消息创建一个新标签,并根据存储在
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()
(请参见下面的代码)并创建一个新标签,但不读取或修改用户默认值

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

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

而不是消息的内容?

由于选项为
nil
,因此您的
sendMessage
代码从不为数组设置任何值

你需要:

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!)
    }
}
override func viewDidLoad(){
super.viewDidLoad()
//加载以前的消息
让nMessages:Int=defaults.integer(forKey:numberOfMessages)
让arrayOfMessages=defaults.stringArray(forKey:“textMessages”)??[]
让arrayOfSenders=defaults.stringArray(forKey:“发送者消息”)??[]

对于0中的i..感谢您的快速回答。不幸的是,我在运行应用程序时仍然有一个错误:my line
let sender:String?=(arrayOfSenders?[i]as?String)
获取以下错误:
线程1:致命错误:索引超出范围
。我该怎么办?1.该行应该按照我在回答中显示的内容进行更改。2.您的
用户默认值
由于您以前的错误而不正常。删除应用程序(从设备/模拟器中)并使用干净的用户默认值和更新的代码重新启动。