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 linelet sender:String?=(arrayOfSenders?[i]as?String)
获取以下错误:线程1:致命错误:索引超出范围
。我该怎么办?1.该行应该按照我在回答中显示的内容进行更改。2.您的用户默认值
由于您以前的错误而不正常。删除应用程序(从设备/模拟器中)并使用干净的用户默认值和更新的代码重新启动。