将布尔值保存到 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 并更新的主要内容,如果未能解决你的问题,请参考以下文章

更新 plist 字典中的布尔值

关于将布尔文件写入 plist

使用 Swift,从 plist 加载数据时,如何区分布尔值和整数值?

使用@Query和休眠更新spring数据jpa中的布尔值

在 coredata 中更新加载布尔值

如果提交表单时未选中复选框,如何将布尔值更新为 0