好的,我有两个视图控制器。一个视图控制器加载我的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但是它不起作用。也非常感谢你的评论,这很容易理解,也很容易理解。
答案 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值,该字典具有每个宠物的键和布尔值作为值。