2015-03-07 3 views
2

Im пытается прочитать plist, который содержит массив Ints. Это мой первый раз, когда я их использую, и я могу читать их в порядке, но plist не обновляется, когда я пишу на него.чтение/запись в массив plist с Swift

вот мой код для чтения и записи ..

class FavouritesManager { 
    var myArray:NSMutableArray = [0] 
    func loadDataPlist(){ 
     let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
     let documentsDirectory = paths.objectAtIndex(0)as NSString 
     let path = documentsDirectory.stringByAppendingPathComponent("FavouriteIndex.plist") 
     let fileManager = NSFileManager.defaultManager() 
     if(!fileManager.fileExistsAtPath(path)) 
     { 
      let bundle = NSBundle.mainBundle().pathForResource("FavouriteIndex", ofType: "plist") 
      fileManager.copyItemAtPath(bundle!, toPath: path, error:nil) 
     } 
     myArray = NSMutableArray(contentsOfFile: path)! 
     println(myArray) 
    } 
    func writeToPlist(indexValue:Int) { 

     if let path = NSBundle.mainBundle().pathForResource("FavouriteIndex", ofType: "plist"){ 
      myArray.addObject(indexValue) 
      myArray.addObject(indexValue+5) 
      myArray.addObject(indexValue+10) 
      myArray.addObject(indexValue+15) 
      myArray.writeToFile(path, atomically: true) 
     } 
    } 

Цель этого кода, чтобы сохранить индекс tableViewCell, который был Добавлен в избранное, так что я могу отобразить эту строку в моем любимом tableViewControllwe

BTW - мой plist выглядит так ... enter image description here Спасибо!

ответ

4

Ваша проблема заключается в том, что вы загружаете plist в каталог документов в loadDataPlist(), но вы по-прежнему вытаскиваете plist из его исходного местоположения в своей функции writeToPlist(indexValue:). Таким образом, вы пытаетесь писать на plist в месте, где вы находитесь. Изменение функции записи этого:

func writeToPlist(indexValue:Int) { 
    var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String 
    var path = paths.stringByAppendingPathComponent("MyPlist.plist") 

    if var plistArray = NSMutableArray(contentsOfFile: path) { 
     plistArray.addObject(indexValue) 
     plistArray.addObject(indexValue+5) 
     plistArray.addObject(indexValue+10) 
     plistArray.addObject(indexValue+15) 
     plistArray.writeToFile(path, atomically: false) 
    } 
} 

Обратите внимание, что вместо того, чтобы добавлять значения в myArray Я только пишу в PLIST. Вам нужно будет решить, хотите ли вы поддерживать два массива (локальная переменная myArray и массив в plist) в зависимости от того, для чего вы используете это. В любом случае, это должно решить вашу проблему.

+0

Спасибо @timgcarlson за ваш ответ, но 1 вопрос ,, В чем разница между загрузкой моего пакета и загрузкой документов из документального фильма? было бы достаточно, чтобы загрузить файл, let bundle = NSBundle.mainBundle(). PathForResource ("FavouriteIndex", ofType: "plist") ? – stringRay2014

+1

Этот комплект - это то, что вы получаете от установленного приложения. Это каталог * только для чтения *, поэтому вы не можете изменять файлы, хранящиеся в комплекте, а также не добавлять какие-либо файлы в комплект. Каталог документов - * read-write * и обычно используется для хранения пользовательских данных для базовых приложений. Вот почему в вашей функции 'loadDataplist()' вы сначала проверяете, существует ли в каталоге Documents пакет PLSit, прежде чем копировать его из пакета в папку «Документы». – timgcarlson

+1

Чтобы конкретно ответить на ваш вопрос, недостаточно просто получить пакет, если вы собираетесь писать в этот файл (который вы делаете). Вот документация по основам файловой системы iOS ... https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html – timgcarlson