1

我想知道如何快速创建一个收藏按钮,当按下该按钮时,“收藏”的对象将成为 tableview 的一部分并保持这种状态。我听说核心数据是一种方法,但我仍然在努力让按钮在按下时发生变化。

当我创建一个按钮时,我得到的只是一个仅在第一次按下时更改的按钮。一个例子是我有一个空的星形按钮,这意味着它不是收藏夹,当我按下它时它会变成一个填充的心形,这意味着它是收藏夹。当我第二次按下按钮时,当它当前是一颗实心星时,它不会改变,仍然是一颗实心星。

我遇到的另一个问题是将信息从对象发送到最喜欢的表格视图。只要最喜欢的按钮切换为填充星,我就不确定如何在表格视图中保留一些东西。

我经常看到的是这个主题,但它都是关于在表格视图中制作一个最喜欢的按钮。我不是在寻找表格视图。我正在尝试做的一个例子就像一个最喜欢的图书应用程序。该应用程序以一个装满书籍的 tableview 形式打开,当按下一个单元格时,它会打开一个包含该书籍信息的新视图控制器,顶部是一个收藏按钮,通常是一个空星。如果我喜欢那本书,我想按下那个按钮,空的星号变成一个实心的星号按钮,表示我喜欢它。这本书的信息然后被发送到一个新的表格视图,其中包含我以前做过的所有喜欢的书。如果我不再喜欢那本书,我想再次按下填充的星形按钮,它会从最喜欢的 tableview 列表中删除。

我对 mysql 有一些关于 swift 的经验,而且我知道有人对使用某种持久性来保存按钮的状态发表了评论。

我最大的问题是我什至不知道从哪里开始。我所做的每一次尝试似乎都以同样的方式结束,所以我真的没有任何源代码供其他人查看。我在网上和 github 上查看过,但我能找到的最接近的东西是一个名为 DoButton 的 cocoapod,但它已经很长时间没有更新了,我担心它不会随着另一个快速更新而持续下去。如果有人能引导我走上正确的道路或知道一个好的教程,我将不胜感激。如果有任何问题我可以回答,我会尽我所能回答。


另一个更新:我设法让按钮工作。它连接到核心数据并保存按钮的状态,即使它退出也是如此。现在剩下的就是创建一个收藏夹 tableView 来存储收藏夹。这是代码:

class ViewController: UIViewController {

    var buttonIsSelected = false

    var favorites = [Favorite]()



    @IBOutlet var onOffButton: UIButton!
    let image1 = UIImage(named: "empty") as UIImage?
    let image2 = UIImage(named: "filled") as UIImage?




    override func viewDidLoad() {
        super.viewDidLoad()
                print("buttonIsSelected: \(buttonIsSelected)")

    let fetchedRequest: NSFetchRequest<Favorite> = Favorite.fetchRequest()
    do {
        let favorite = try PersistenceService.context.fetch(fetchedRequest)
        for fav in favorite {
            resetAllRecord(entity: fav.favorite)
            buttonIsSelected = fav.favorite
            print("fav.favorite: \(fav.favorite)")
            print("button: \(buttonIsSelected)")
            if fav.favorite == true {
                onOffButton.setImage(image2, for: .normal)
                }
            }
        } catch {
    }
    }


    //button Action
@IBAction func onOffButtonPressed(_ sender: Any) {
    buttonIsSelected = !buttonIsSelected
    if buttonIsSelected == true {
        onOffButton.setImage(image2, for: .normal)
    } else if buttonIsSelected == false {
        onOffButton.setImage(image1, for: .normal)
    }
    saveBool(bool: buttonIsSelected)
}

    //save to core data
func saveBool(bool: Bool) {
    if bool == true {
        print("favorite")
        print("buttonIsSelected \(buttonIsSelected)")
        let liked = Favorite(context: PersistenceService.context)
        liked.favorite = bool
        PersistenceService.saveContext()
        favorites.append(liked)
    } else if bool == false {
        print("unfavorite")
        print("buttonIsSelected \(buttonIsSelected)")
        let liked = Favorite(context: PersistenceService.context)
        liked.favorite = bool
        PersistenceService.saveContext()
        favorites.append(liked)
    }
}

        //clears core data so it doens't get full
func resetAllRecord(entity: Bool) {
    let context = PersistenceService.persistentContainer.viewContext
    let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Favorite")
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
    do
    {
        try context.execute(deleteRequest)
        try context.save()
    }
    catch
    {
        print ("There was an error")
    }
}

}

4

1 回答 1

0

在对象类中创建一个名为 bool 的参数isFavorite,默认设置为 false。当最喜欢的按钮被按下时,布尔值应该从 false 变为 true。当您必须仅访问“最喜欢的”对象时,使用for循环遍历对象数组并通过if语句检查isFavorite参数是否为真。如果是,则必须将该元素附加到一个新的对象数组(可能称为favoriteObjects)中,这样您就拥有了所有您喜欢的对象。其余的非常简单。

于 2018-03-11T23:49:34.197 回答