将数组添加到PLIST(我在PLIST上看不到一项不超过一项)


import Foundation
struct answers : Codable {
    var answer : String
    var number : Int
}
var allAnswers: Array = [answers]()
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let archiveURL = documentsDirectory.appendingPathExtension("answers_test").appendingPathExtension("plist")
class ViewController: UIViewController {
    @IBOutlet var vcLabels: [UILabel]!
    @IBOutlet weak var vcTextField: UITextField!
    var index : Int = 0
    @IBAction func vcButtonPressed(_ sender: Any) {
       vcLabels[index].text =  vcTextField.text
      var newAnswer = answers(answer: vcLabels[index].text!, number: index)
        var newAnswers = [newAnswer]
       print(archiveURL)
        index += 1
        if index == 4 {
            index = 0
        }
        let propertyListEncoder = PropertyListEncoder()
        let encodedNotes = try? propertyListEncoder.encode(newAnswers)
        try? encodedNotes?.write(to:archiveURL, options: .noFileProtection)

    }

首先,请符合命名约定的结构和班级名称以大写字母开头的命名约定,这是结构Answer和属性answer不能误解的好处。为了避免更多的混乱以单数形式将结构命名(在创建新答案的行中,您是在语义上创建一个答案,而不是一个答案(。属性可以声明为常数(let(。

struct Answer : Codable {
    let answer : String
    let number : Int
}

您的问题非常清楚:如果要将某些内容附加到属性列表文件中,则首先要读取它是从archiveURL中提取的,请附加项目并将其写回。

@IBAction func vcButtonPressed(_ sender: Any) {
    vcLabels[index].text =  vcTextField.text
    let newAnswer = Answer(answer: vcLabels[index].text!, number: index)
    print(archiveURL)
    index += 1
    if index == 4 {
        index = 0
    }
    do {
        let data = try Data(contentsOf: archiveURL)
        var savedAnswers = PropertyListDecoder().decode([answers], from: data)
        savedAnswers.append(newAnswer)
        let encodedNotes = try PropertyListEncoder().encode(savedAnswers)
        try encodedNotes?.write(to:archiveURL, options: .noFileProtection)
    } catch { print(error) }
}

不要忽略try?错误。处理

最新更新