为什么我的数据没有写入plist文件?

时间:2016-12-05 22:00:45

标签: ios swift

我试图使用Swift创建一个可以向数据库添加类的模块(ClassA.plist)。代码是这样的:

class AddClass:UITableViewController {
@IBOutlet weak var txtClassName: UITextField!


@IBAction func Save(_ sender: Any) {
    let plistPath = Bundle.main.path(forResource: "ClassA", ofType:"plist")
    let array = NSMutableArray(contentsOfFile: plistPath!)
    let AddData = NSDictionary(object: txtClassName.text!, forKey: "name" as NSCopying)

    array?.add(AddData)

    array?.write(toFile: plistPath!, atomically: false)
    DispatchQueue.main.async {
        super.tableView.reloadData()
    }
}

我的故事板是这样的:

Storyboard Save Button

但是,当我在文本字段中写入内容并单击“保存”时,我的数据库中没有任何更改。没有显示警告,错误或日志。有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您无法写入应用包中的文件。应用包是只读的。您需要将文件复制到一个沙箱目录(如文档目录),然后才能进行更改。

答案 1 :(得分:0)

正如许多人所指出的那样,应用程序的包是只读的。你可以做的是复制文件,如果你真的想要使用它并将它放在documentDirectory中,你可以在那里读写它。

let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
let plistPath = paths.appending("/data.plist")
let fileManager = FileManager.default

if !fileManager.fileExists(atPath: plistPath)
{
  // Default plist name is Info. Just using ClassA
  let bundle = Bundle.main.path(forResource: "ClassA", ofType: "plist")
  try! fileManager.copyItem(atPath: bundle!, toPath: plistPath)
}


let data = NSMutableDictionary(contentsOfFile: plistPath)

data?.setObject("Hello World", forKey: "name" as NSCopying)
data?.write(toFile: plistPath, atomically: true)

print(data)