将布尔值保存到 Plist 并更新
Posted
技术标签:
【中文标题】将布尔值保存到 Plist 并更新【英文标题】:Saving Bool Value on to Plist and Update 【发布时间】:2018-01-03 13:27:42 【问题描述】:如果我的根是一个数组并且充满了字典,那么 viewcontroller 1 就设置好了
let path = Bundle.main.path(forResource:"Animals", ofType: "plist")
let dics = NSArray(contentsOfFile: path!) as! [NSMutableDictionary]
viewcontroller 2 设置完毕
let path = Bundle.main.path(forResource:"Animals", ofType: "plist")
if FileManager.default.fileExists(atPath: path!)
let dics = NSArray(contentsOfFile: path!) as! [NSMutableDictionary]
dics.setValue(isFavorite, ForKey: "fav")
dics.write(toFile: path!, atomically: true)
我将 isFavorite 作为变量放在代码的顶部,如果用户点击按钮,isFavorite 会从 false 变为 true,反之亦然。 isFavorite = !isfavorite.现在,如果我运行这段代码,它会指出 NSMutableDictionary 没有成员 setValue 或 write。我不确定如何让系统知道我从 ViewController 1 中的 plist 的数组中的字典列表中单击了第二个字典单元,并且我想将具有“fav”的键值从 false 更改为 true ViewController 2. 我知道这听起来有点令人困惑,所以让我重新表述一下。 ViewController 1 有一堆动物 Dogs、Cats、Fish 等。所以现在如果用户点击 Cats,它会将它们带到 viewcontroller 2 和 viewcontroller 2 上,如果用户点击它,我想要一个收藏按钮,它会更新 Plist 文件和布尔值猫从假变为真。我尝试使用 userDefaults 方法,如果我更改一只动物的布尔值,它会更改所有动物。所以我在 plist 中的所有动物中做了另一个布尔值的关键值。我希望当用户点击 ViewController 2 上的收藏按钮时更改该布尔值,但它不会保存到 plist 文件中。
更新:所以看看我的代码,我认为问题在于 ViewController 1。在 ViewController 1 上我写道:
let path = Bundle.main.path(forResource:"Animals", ofType: "plist")
let dics = NSArray(contentsOfFile: path!) as! [NSMutableDictionary]
self.orginalData = dics.mapAnimals(Type: $0["Type"] as! String, Desc: $0["Desc"] as! String, fav: $0["fav"] as! Bool)
self.filteredData = self.original Data
然后我在 ViewController 1 的 tableview 上显示它,如下所示:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
if isFiltering()
searchFooter.setIsFilteringToShow(filteredItemCount: filteredData.count,
of: originalData.count)
return filteredData.count
searchFooter.setNotFiltering()
return originalData.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
var animals : Animals
if isFiltering()
animals = filteredData[indexPath.row]
else
animals = originalData[indexPath.row]
cell.textLabel?.text = Animals.Type
cell.detailTextLabel!.text = Animals.Desc
return cell
【问题讨论】:
【参考方案1】:关于setValue
:你需要在字典上调用它,而不是数组。
关于write
:您需要转换为NSArray
,因为Swift.Array
不存在。
它需要更接近于这样的东西:
let isFavorite = true // based on user selection
let selectedIndex = 0 // this is the index of the animal selected in VC 1
if let path = Bundle.main.path(forResource:"Animals", ofType: "plist"),
FileManager.default.fileExists(atPath: path),
let dics = NSArray(contentsOfFile: path) as? [NSMutableDictionary]
let selectedAnimal = dics[selectedIndex]
selectedAnimal["fav"] = isFavorite // this replaces `setValue`
(dics as NSArray).write(toFile: path, atomically: true)
【讨论】:
好的,所以当我运行此代码并按下视图控制器 2 上最喜欢的按钮时,我收到此错误消息 - 由于未捕获的异常 NSInternalInconsistencyException 导致应用程序终止,原因:'-[__NSCFDictionary setObject:forKey:]:变异方法发送到不可变对象'。我以为我把 NSMutableDictionary 不确定为什么会弹出这个错误消息 我在上面更新了我认为导致错误消息的代码。但我不确定如何将我的代码更改为 MutableDictionary 这是因为您正在使用不可变容器加载 plist。看看这个:***.com/questions/39919415/… 是否有更新版本,因为我认为 swift 4 不再接受这些语法。我尝试谷歌搜索 NSpropertylistserialization mutable 没有看到它的任何最新版本以上是关于将布尔值保存到 Plist 并更新的主要内容,如果未能解决你的问题,请参考以下文章