2015-01-20 1 views
0

앱이 할일 목록 앱과 매우 유사한 목록입니다. 그것은 괜찮지 만 영속 데이터 (NSUser Defaults)와 관련하여 코드를 추가 할 때 오류가 발생합니다. 아래에 오류 및 내 코드가 있습니다. (나는 NSUserdefaults 부분을 주석 처리했다.) 네가 나를 인도하고 해답을 줄 수 있기를 바랐다.영구 저장 오류 - 형식에 대한 속성 목록이 잘못되었습니다. 200

Error: 2015-01-19 22:26:40.783 Shoplisters[62316:22301266] Property list invalid for format: 200 (property lists cannot contain objects of type 'CFType') 2015-01-19 22:26:40.783 Shoplisters[62316:22301266] Attempt to set a non-property-list object ("", "") as an NSUserDefaults/CFPreferences value for key shoppingList 2015-01-19 22:26:40.785 Shoplisters[62316:22301266] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object ("", "") for key shoppingList'

코드 : 수입 UIKit

var shoppingList:[ShopList] = listData 

class ShopListTableViewController: UITableViewController { 

@IBAction func cancelToListView(segue:UIStoryboardSegue) { 
dismissViewControllerAnimated(true, completion: nil) 
//actions for cancel button 
} 

@IBAction func saveListDetail(segue:UIStoryboardSegue) { 

let listDetailsViewController = segue.sourceViewController as  AddNewListTableViewController 

//add the new list to the shopping list array 
shoppingList.append(listDetailsViewController.listDetails) 

//NSUserdefaults 
//let fixedShoppingList = shoppingList 
//NSUserDefaults.standardUserDefaults().setObject(fixedShoppingList, forKey: "shoppingList") 
//NSUserDefaults.standardUserDefaults().synchronize() 

//update the table view 
let indexPath = NSIndexPath(forRow: shoppingList.count-1, inSection: 0) 
tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) 

//hide the detail view controller 
dismissViewControllerAnimated(true, completion: nil) 


} 


override func viewDidLoad() { 
super.viewDidLoad() 


//if NSUserDefaults.standardUserDefaults().objectForKey("shoppingList") != nil { 

//shoppingList = NSUserDefaults.standardUserDefaults().objectForKey("shoppingList") as [ShopList] 

//} 


} 


override func didReceiveMemoryWarning() { 
super.didReceiveMemoryWarning() 
// Dispose of any resources that can be recreated. 
} 


override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
// Return the number of sections. 
return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection  section: Int) -> Int { 
// Return the number of rows in the section. 

return shoppingList.count 

} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath  indexPath: NSIndexPath) -> UITableViewCell { 

var cell = tableView.dequeueReusableCellWithIdentifier("listCell", forIndexPath: indexPath) as ShoppingListTableViewCell 

//fill the prototype cell with the ff values: 
var list = shoppingList[indexPath.row] as ShopList 
cell.listNameLabel.text = list.name 
cell.totalBudgetLabel.text = list.budget 
cell.barColor.image = imageForColors(list.barColors) 

return cell 

} 

데이터 : I 선언

let kString = "string" 
let kInt = "int" 

: 당신은 단순히 저장/다음과 같은 패턴으로 설정을 복원 할 수 있습니다

import Foundation 

import UIKit 

class ShopList: NSObject { 
var name:String 
var budget:String 
var barColors:String 

init(name:String, budget:String, barcolor:String) { 
self.name = name 
self.budget = budget 
self.barColors = barcolor 
super.init() 
} 
} 
+1

NSCoding을 준수하는 NSUserDefaults에만 요소를 넣을 수 있습니다. CFType은 그렇지 않습니다. 예를 들어 NSData 또는 이와 유사한 것. –

+0

답장을 보내 주셔서 감사합니다. 사실 iOS에 신속하고 신속합니다. 기존 코드에 샘플을 제공 할 수 있습니까? 그것에 대해 어떻게 해야할지 잘 모릅니다. –

답변

0

이 const 글로벌 수준의 개미. 스위프트에는 #define이 없습니다. 또한 관련 클래스의 낙타의 경우 문자를 사용하여 이러한 상수를 확대합니다. 예 : class MyFancyClass에 대한 첫 번째 이름은 kMFCstring입니다.

NSUserDefaults.standardUserDefaults().setObject("string data", forKey: kString) 
NSUserDefaults.standardUserDefaults().setInteger(4711, forKey: kInt) 

이렇게하면 "문자열 데이터"와 4711이 기본값으로 저장됩니다. int, float, object 등의 메소드에는 여러 가지가 있습니다. 도움말이나 자동 완성을 참조하십시오. 또한 파일에 설정 저장을 강제하는 동기화 방법이 있지만 운영 체제는 유용 할 때 자동으로이를 수행합니다 (예 : 프로그램이 종료 될 때).

let stringVal = NSUserDefaults.standardUserDefaults().objectForKey(kString)! as String 
let intVal = NSUserDefaults.standardUserDefaults().integerForKey(kInt)! as String 

이렇게하면 값이 복원됩니다. 이전의 set-set의 경우와 반대입니다.

개체가 아닌 유형의 경우 컨테이너를 만들 수 있습니다. 한 가지 방법은 NSValue을 사용하는 것입니다.

NSUserDefaults.standardUserDefaults().setObject(NSValue(NSMakeRect(1,2,3,4), forKey: "myRect") 

확인 내부 포장 할 수있는 다른 어떤 NSValue에 대한 도움말.

+0

그래서 기본적으로 위의 shoppingList 변수를 사용할 수 없다는 말입니까? var shoppingList = [ShopList (이름 : "새 목록 추가", 예산 : "$ 0.00", barcolor : "")] –

+0

예. 배열의 요소를 변환해야합니다. 그들을 NSValue 배열로 팩하십시오. –