使用 NSPredicate 添加使用户能够'Favourite'对象,这些对象随后将显示在单独的 TableView 中(没有 CoreData!



我目前有一个 tableView,它正在解析和显示来自JSON文件的数据。按下单元格后,用户将转到detailView屏幕以查看更多信息。

我现在正在尝试在detailView中设置一个Favourite按钮,以便用户可以按下一个按钮,该按钮会将对象添加到favouriteView(这将设置与tableView完全相同,但仅显示已被收藏的位置。

我的理解是,实现这一目标的最佳方法是使用NSPredicate.我已经环顾四周几个小时了,我似乎找不到不使用CoreData的解决方案(尽管我找到了一个消息来源说CoreData没有必要)。我想在不使用CoreData的情况下实现Favourite功能。

我已经在detailView中设置了一个最喜欢的按钮,它设置了一个从falsetrue的可变isFavourite。请参阅下面的所有相关代码。

示例 JSON 对象

{
"locations": [
{
"id": "0001",
"name": "Helensburgh Tunnels",
"type": "Tunnels, Beach, Views",
"location": "Helensburgh, South Coast",
"image": "Helensburgh-Tunnels.jpg",
"activity": "Walking, photography, tunnelling",
"isVisited": false,
"isFavourite": false,
"latitude": -34.178985,
"longitude": 150.992867
}
]
}

我在详细信息视图中设置的最喜欢的按钮:

@IBOutlet weak var favouriteButton: UIButton!
@IBAction func favouriteButtonTapped(_ sender: Any) {
self.location.isFavourite = self.location.isFavourite ? false : true
print(location.isFavourite)
// Favourite button
if location.isFavourite == false {
favouriteButton?.setImage(UIImage(named: "starLine.png"), for: .normal)
} else {
favouriteButton?.setImage(UIImage(named: "starFull.png"), for: .normal)
}
}

如何获取所有已设置为isFavourite = true的对象并将它们显示在tableView中?

这是FavouriteLocationsViewController类的一部分,我需要在这里修复什么才能使其正常运行?

class FavouriteLocationsViewController: UITableViewController {
var locations = [Location]()
override func viewDidLoad() {
super.viewDidLoad()
// Remove the title of the back button
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
if let locationJson = readLocation(){
if let locationArray = locationJson["locations"] as? [[String:Any]]{
for location in locationArray{
locations.append(Location.init(locationInfo: location))
}
print(locations.count)
self.tableView.reloadData()
}
}
}
// Filter to show only favourite locations
func filterArrayOfDictonaryWithKeyValueUsingPredicate(arrOfDict: NSArray, keyOfDict: String, strSearchText: String) -> NSArray{
let favouritePredicate = NSPredicate(format: "isFavourite == true")
let arrResult = arrOfDict.filtered(using: favouritePredicate)
return arrResult as NSArray
}
}

您想在那里只显示喜欢的数据吗?

您有上面显示的字典数组。

您可以使用谓词筛选该数组。

并且您只能获得收藏夹=="真"的对象

使用以下函数传递位置数组,传递键的字典 - 是收藏夹

strSearchText - 对于您的示例,请使用true

func filterArrayOfDictonaryWithKeyValueUsingPredicate(arrOfDict: NSArray, keyOfDict: String, strSearchText: String) -> NSArray{
let searchPredicate = NSPredicate(format: "(keyOfDict) CONTAINS[C] %@", strSearchText)
let arrResult = arrOfDict.filtered(using: searchPredicate)
return arrResult as NSArray
}

最新更新