返回viewcontroller 1然后返回viewcontroller 2

时间:2017-12-30 21:18:04

标签: ios swift save default favorites

好的,我有两个视图控制器。一个视图控制器加载我的Plist上的所有单元格,第二个视图控制器打开单元格并显示描述。例如: 查看控制器1: 狗 猫 小鼠

点击Dog cell,它会带你到View Controller 2: 狗去了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但是它不起作用。也非常感谢你的评论,这很容易理解,也很容易理解。

1 个答案:

答案 0 :(得分:0)

当您返回第二个视图控制器时,未填充星形,因为您使用@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值,该字典具有每个宠物的键和布尔值作为值。