我目前有一个 tableView,它正在解析和显示来自JSON
文件的数据。按下单元格后,用户将转到detailView
屏幕以查看更多信息。
我现在正在尝试在detailView
中设置一个Favourite
按钮,以便用户可以按下一个按钮,该按钮会将对象添加到favouriteView
(这将设置与tableView
完全相同,但仅显示已被收藏的位置。
我的理解是,实现这一目标的最佳方法是使用NSPredicate
.我已经环顾四周几个小时了,我似乎找不到不使用CoreData
的解决方案(尽管我找到了一个消息来源说CoreData
没有必要)。我想在不使用CoreData
的情况下实现Favourite
功能。
我已经在detailView
中设置了一个最喜欢的按钮,它设置了一个从false
到true
的可变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
}