gpt4 book ai didi

ios - 返回 View Controller 1 然后返回 View Controller 2 时,UserDefault 未保存

转载 作者:行者123 更新时间:2023-11-30 11:53:55 25 4
gpt4 key购买 nike

好吧,我有两个 View Controller 。一个 View Controller 加载 Plist 上的所有单元格,第二个 View Controller 打开单元格并向您显示描述。例如:查看 Controller 1:狗猫鼠标

点击 Dog 单元格,您将看到 View Controller 2:狗发出汪汪声。

View Controller 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 值。所以在我的 Animals Plist 上,我有一个 Item 0 类型字典,第一个键称为 Animal,类型是字符串,值是“dog”,第二个键是 Description,类型是字符串,值是“dog gone woof”,第三个键称为fav,类型为 Bool,值目前为 No,但我尝试将此值更改为 Yes,但它不起作用。也非常感谢您的评论,它很容易理解也很容易理解。

最佳答案

当您返回到第二个 View Controller 时,星号并未填充,因为您在 @IBAction func addToFav(_ sender:UIButton) 中设置了图像。方法。那就是您点击按钮的时候。您应该将这部分代码放在您也在 didLoad() 中调用的另一个方法中。 .

第二个 View Controller 应该是这样的:

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 的状态另一种方法需要重复代码。

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

关于ios - 返回 View Controller 1 然后返回 View Controller 2 时,UserDefault 未保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48037970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com