返回viewcontroller 1然后返回viewcontroller 2时,UserDefault没有被保存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了返回viewcontroller 1然后返回viewcontroller 2时,UserDefault没有被保存相关的知识,希望对你有一定的参考价值。

好的,所以我有两个视图控制器。一个视图控制器加载我的Plist上的所有单元格,第二个视图控制器打开单元格并显示描述。例如:View Controller 1:Dog Cat Mouse

单击Dog cell,它将带您进入View Controller 2:Dog goes Woof。

视图控制器1写道:

  ovverride func prepare(for segue: UIStoryBoardSegue, sender: Any?) {
      if segue.identifier == "showDetail" {
         let animals: Animals
         if isFiltering() {
            animals = filteredData[indexPath.row]
            }
         else {
            animals = originalData[indexPath.row]
            }
          let controller = (segue.destination as! UINavigationController).topViewController as! SecondViewController
          controller.detailedAnimals = animals
          controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
          contrller.navigationItem.leftItemsSupplementBackButton = true
          }
    }
  }

这是我在viewcontroller 2中写的更新

var isFavorite : Bool = false

@IBAction func addToFav(_ sender:UIButton) {
    isFavorite = !isFavorite 
    UpdateButtonAppearance()
    saveData()
    }

 private func UpdateButtonAppearance(){
if isFavorite{
         let image = UIImage(named: "addFav")
         favButton.setImage(image, for: . normal)
         savedData()
         }

    else {
         let image = UIImage(named: "addFavFilled")
        favButton.setImage(image, for: . normal)
         savedData()
         }
 }

 ovveride func viewDidLoad(){
   UpdateButtonAppearance()
   saveData()
 }  

    //updated code
   func getFilePath () -> String {
   var path: [AnyObject] = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) as [AnyObject]
       let documentsDirectory: String = path[0] as! String
       let filepath = documentsDirectory.appending("Animals.plist")
       return filepath
   }

func saveData(){
    let myDict : NSMutableDictionary = NSMutableDictionary()
    myDict["fav"] = NSNumber(booleanLiteral: isFavorite)
    myDict.write(toFile: self.getFilePath(), atomically: true)
}

func getBool(){
    if FileManager.default.fileExists(atPath: self.getFilePath()) {
        var myDict = NSDictionary(contentsOfFile: self.getFilePath()) as! 
   [String:AnyObject]
        let myBool: Bool = myDict["fav"]!.boolValue
        isFavorite = myBool
    }

我看到了如何在Plist中更改bool并以这种方式编写的教程。代码编译但我认为它不会改变bool值。所以在我的动物Plist上我有一个Item 0类型字典,第一个键叫做Animal,类型是字符串,值是“dog”,第二个键是Description,type是string,value是“dog goes woof”,第三个键被调用fav,类型是Bool,现在值为No但我试图将此值更改为Yes但是它不起作用。也非常感谢你的评论,这很容易理解,也很容易理解。

答案

返回第二个视图控制器时,未填充星形,因为您使用@IBAction func addToFav(_ sender:UIButton)方法设置图像。那是你点按按钮的时候。您应该在另一个方法中使用didLoad()中的那部分代码。

第二视图控制器应该是这样的:

var isFavorite = UserDefaults.standard.bool(forKey: "isFavorite")

func didLoad() {
     super.didLoad()
     updateButtonAppearance()
}

private updateButtonAppearance() {
     if isFavorite {
         let image = UIImage(named: "addFavFilled")
         button.setImage(image, for: . normal)
     }

     else {
         let image = UIImage(named: "addFav")
         button.setImage(image, for: . normal)
     }
}

@IBAction func addToFav(_ sender:UIButton) {
    isFavorite = !isFavorite
    UserDefaults.standard.set(isFavorite, forKey: "isFavorite")
    updateButtonAppearance()
}

此外,代码可以改进,不在addToFav方法中保存UserDefaults中的变量,但每当更改isFavourite时。也许你以后想要在另一种需要代码重复的方法中改变isFavourite的状态。

另请注意,您在isFavourite下的UserDefaults中保存所有宠物的值。这意味着如果你喜欢一只宠物,所有其他宠物都会受到青睐,反之亦然。考虑用一个字典替换用户默认值中的bool值,该字典具有每个宠物的键和布尔值作为值。

以上是关于返回viewcontroller 1然后返回viewcontroller 2时,UserDefault没有被保存的主要内容,如果未能解决你的问题,请参考以下文章

ViewController 将结果返回给调用它的 ViewController [重复]

从 UITableView 导航到另一个 ViewController 然后返回到 TableViewController 会导致一些元素消失

如何有返回按钮才能返回到第一个 ViewController?

无需返回按钮即可推送到 ViewController

iOS:通过委托方法从推送的 ViewController 返回?

无法返回 UIPageViewController 内的初始页面 ViewController