我想知道如何在swift中创建一个收藏按钮,当按下该按钮时,“收藏”的对象将成为tableview的一部分并保持这种状态。我听说核心数据是这样做的一种方式,但我仍然很难按下按钮。
当我创建一个按钮时,我得到的是一个仅在第一次按下时才会改变的按钮。一个例子是我有一个空的星形按钮,这意味着它不是一个喜欢的,当我按下它时,它会变成一个充满了心脏,这意味着它被收藏。当我第二次按下按钮时,当它当前是一个填充的星形时,它不会改变并仍然是一个填充的星。
我遇到的另一个问题是将对象的信息发送到收藏的tableview。只要将收藏夹按钮切换为填充星形,我不确定如何在tableview中保留某些内容。
我看到的很多是这个主题,但它是关于在表格视图中制作一个最喜欢的按钮。我不是在寻找表格。我想要做的一个例子就像一本最喜欢的书籍应用程序。该应用程序以一个充满书籍的桌面视图打开,当按下一个单元格时,它会打开一个带有该书信息的新视图控制器,顶部是一个最喜欢的按钮,通常是一个空星。如果我喜欢那本书,我想按下那个按钮,空星变成一个填充的星形按钮,表明我喜欢它。然后将该书的信息发送到一个新的表格视图,该视图包含我之前完成的所有喜欢的书籍。如果我不再喜欢那本书,我想再次按下填充的星形按钮,它将从最喜欢的tableview列表中删除。
我对swift有一些关于mysql的经验,我知道有些人已经发表了关于使用某种持久性来保存按钮状态的评论。
我最大的问题是我甚至不知道从哪里开始。我做的每一次尝试似乎都以同样的方式结束,所以我真的没有任何其他人可以看到的源代码。我已经在网上和通过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")
}
}
}
答案 0 :(得分:0)
在object类中创建一个名为isFavorite
的bool参数,默认设置为false。当按下收藏夹按钮时,布尔应该从false变为true。当您只需要访问“最喜欢的”对象时,for
循环遍历您的对象数组并通过if
语句检查isFavorite
参数是否为true。如果是,则必须将元素附加到可能称为favoriteObjects
的新对象数组中,并且您拥有所有喜欢的对象。其余的非常简单。