2016-12-05 3 views
1

Ich habe versucht, ein Modul mit Swift, die eine Klasse in die Datenbank (ClassA.plist) hinzufügen können. Der Code ist wie folgt:Warum werden meine Daten nicht in die PLIST-Datei geschrieben?

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() 
    } 
} 

Und mein Storyboard ist wie folgt aus:

Storyboard Save Button

Aber, wie ich etwas in das Textfeld schreiben und klicken Sie auf Speichern, nichts in meiner Datenbank geändert. Kein Waring, Fehler oder Protokolle wird angezeigt. Kennt jemand, wie man dieses Problem löst?

+0

haben Sie versuchen dictionery statt Array –

+0

Verwenden Sie diese Antwort, wenn es sense.http macht: //stackoverflow.com/questions/6697247/how-to-create-plist-files-programmatically-in-iphone –

+0

Wie in so vielen anderen Posts geschrieben wurde, ist das Bündel einer App schreibgeschützt. – rmaddy

Antwort

0

Sie können nicht in eine Datei im App-Bundle schreiben. Das App-Paket ist schreibgeschützt. Sie müssen Ihre Datei in eines Ihrer Sandbox-Verzeichnisse wie das Dokumentenverzeichnis kopieren, bevor Sie es ändern können.

+0

Es gibt viele Duplikate, die geschlossen werden könnten, aber ich konnte keine in Swift finden. – rmaddy

+0

Und nun, dank Christian, kann dieser Thread die schnelle Antwort auf diese ewige Frage sein ... –

+0

Eigentlich habe ich endlich einen gefunden - und es ist deine Antwort. – rmaddy

0

Wie viele darauf hingewiesen haben, ist das Bündel der App schreibgeschützt. Was Sie tun können, ist, die Datei zu kopieren, wenn Sie sie wirklich benutzen wollen, und sie in das documentDirectory schreiben, wo Sie sie lesen und schreiben können.

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) 
Verwandte Themen