我有一个名为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()
(请参阅下面的代码)并创建新标签,但不会读取或修改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
而不是消息的内容?
答案 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
可编码并将(单个)数据数组写入文件。所有这些都留给读者练习,因为它远远超出了原始问题的范围。