【问题标题】:UserDefault To Save Button StateUserDefault 保存按钮状态
【发布时间】:2017-04-15 18:23:58
【问题描述】:

我正在尝试通过保存状态来完成我最喜欢的按钮,即使我退出视图 \ App 也是如此。如果有人能告诉我我该怎么做就太好了 这个,我使用 Xcode 8 和 Swift 3 编码。

  //create a new button
    let Favoritebutton: UIButton = UIButton(type: UIButtonType.custom)
    //set image for button
    Favoritebutton.setImage(UIImage(named: "EmptyHeart.png"), for: .normal)
    Favoritebutton.setImage(UIImage(named: "FilledHeart.png"), for: .selected)
    //add function for button
    Favoritebutton.addTarget(self, action: #selector(self.button), for: .touchUpInside)
    //set frame
    Favoritebutton.frame = CGRect(x:0,y: 0,width: 35,height: 35)

    Favoritebutton.isSelected = UserDefaults.standard.bool(forKey: "isSaved")

    let barButton = UIBarButtonItem(customView: Favoritebutton)
    //assign button to navigationbar

    self.navigationItem.rightBarButtonItem = barButton

    let state = UserDefaults.standard.bool(forKey: "isSaved") ?? false

    }


@IBAction func button(sender: UIButton) {

    sender.isSelected = !sender.isSelected
    if let Favoritebutton = sender as? UIButton {
        Favoritebutton.isSelected = UserDefaults.standard.bool(forKey: "isSaved")
        if Favoritebutton.isSelected {
            // set selected
            Favoritebutton.isSelected = true



    // set badge Value to tabbar item.
    let tabItem = self.tabBarController?.tabBar.items![3]
    sel_val = tabItem?.badgeValue
    if(sel_val == nil){
        sel_val = "0"
    }
    let sel_num  = Int(sel_val!)
    tabItem!.badgeValue = String(format: "%d", sel_num! + 1) as String
    //Add Favorite
    let Fav: NSMutableArray = []
    Fav.add(barImage)
    Fav.add(barName)
    Fav.add(streetName)
    favorite.add(Fav)




        } else {
            // set deselected
            Favoritebutton.isSelected = false
            //Badge Value Count.
            let tabItem = self.tabBarController?.tabBar.items![3]
            sel_val = tabItem?.badgeValue
            if(sel_val == nil){
                sel_val = "0"
            }
            let sel_num  = Int(sel_val!)
            tabItem!.badgeValue = String(format: "%d", sel_num! - 1) as String
            //Remove Favorite
            let Fav: NSMutableArray = []
            Fav.add(barImage)
            Fav.add(barName)
            Fav.add(streetName)
            favorite.remove(Fav)


        }
    }

【问题讨论】:

  • 您正在保存状态,但您需要在viewDidLoad 中重新读取它。
  • 请问我该怎么做? @vadian
  • 您的代码只会将“isSaved”键保存为真。您从未编写代码来加载或保存按钮的选定状态。有关将按钮的选定状态加载并保存到 UserDefaults 的代码,请参见 @Scinfu 的答案。
  • @DuncanC 你是说 Scinifu 的代码是正确的?和 vadian 说它不是......

标签: ios swift xcode uibutton nsuserdefaults


【解决方案1】:

您可以将button中的代码缩减为

@IBAction func button(sender: UIButton) {

    sender.isSelected = !sender.isSelected
    UserDefaults.standard.set(sender.isSelected, forKey: "isSaved")
}

要设置状态,您必须回读它

let Favoritebutton = UIButton(type: UIButtonType.custom)
//set image for button
Favoritebutton.setImage(UIImage(named: "EmptyHeart.png"), for: .normal)
Favoritebutton.setImage(UIImage(named: "FilledHeart.png"), for: .selected)
Favoritebutton.isSelected = UserDefaults.standard.bool(forKey: "isSaved")
...

编辑:

我不知道您的代码做了什么,但有很多冗余代码。 IBAction 可以简化为(当然,未经测试)

@IBAction func button(sender: UIButton) {

    let newValue = !sender.isSelected
    sender.isSelected = newValue
    UserDefaults.standard.set(newValue, forKey: "isSaved")

    let tabItem = self.tabBarController?.tabBar.items![3]
    sel_val = tabItem?.badgeValue
    if(sel_val == nil){
        sel_val = "0"
    }
    let sel_num  = Int(sel_val!)

    let fav: NSMutableArray = []
    fav.add(barImage)
    fav.add(barName)
    fav.add(streetName)
    if sender.isSelected {
        tabItem!.badgeValue = String(format: "%d", sel_num! + 1)
        favorite.add(fav)
    } else {
        tabItem!.badgeValue = String(format: "%d", sel_num! - 1)
        favorite.remove(fav)
    }
}

请以小写字母开头命名变量。

【讨论】:

  • 看我用完整代码更新了我的问题....现在我的按钮isSelected 一直都可以匹配我的完整代码吗?
  • 您的代码非常混乱。您应该准确地描述代码应该做什么。例如MY_FAV_KEY 是干什么用的?
  • 更新的代码...你能让这个代码保存按钮状态吗?
  • 好的现在听它保存按钮状态但它不区分单元格......就像它不识别 indexPath
  • 如果它保存状态,则问题得到回答。您的问题没有提及有关单元格和索引路径的任何内容。
【解决方案2】:

每次使用UserDefaults.standard.set需要同步时,添加UserDefaults.standard.synchronize()

要删除/删除保存的值,请使用UserDefaults.standard.removeObject(forKey: "YOUR_KEY")

这是你的功能

@IBAction func button(sender: UIButton) {

    sender.isSelected = !sender.isSelected


    //one thing i tried , doesn't work :
    UserDefaults.standard.set(true,forKey: "isSaved")
    UserDefaults.standard.synchronize()


    if let Favoritebutton = sender as? UIButton {
        if Favoritebutton.isSelected {
            // set selected
            Favoritebutton.isSelected = true
            UserDefaults.standard.set(true, forKey: "MY_FAV_KEY")
            UserDefaults.standard.synchronize()
            //Add to favorites

        } else {
            // set deselected
            Favoritebutton.isSelected = false
            UserDefaults.standard.set(false, forKey: "MY_FAV_KEY")
            UserDefaults.standard.synchronize()
            //remove from Favorites

        }
    }
}

【讨论】:

  • 它不工作.....当我按下按钮并且它被选中然后我完全看到它仍然没有保存按钮状态......任何其他想法如何制作它工作吗?
  • 你确实不需要需要同步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多