我目前有一个tableView,它解析并显示来自JSON
文件的数据。按下单元格后,用户将进入detailView
屏幕以查看更多信息。
我现在正尝试在Favourite
内设置detailView
按钮,以便用户可以按下一个按钮,将对象添加到favouriteView
(这将设置为与tableView
完全相同,但仅显示已被青睐的位置。
我的理解是,实现这一目标的最佳方法是使用NSPredicate
。我一直在寻找几个小时,我似乎无法找到一个不使用CoreData
的解决方案(尽管我找到了一个说明CoreData
没有必要的来源)。我想在不使用Favourite
的情况下实现CoreData
功能。
我已经在detailView
设置了收藏夹按钮,该按钮会将变量isFavourite
从false
设置为true
。请参阅下面的所有相关代码。
示例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
}
]
}
我在detailView中设置的收藏夹按钮:
@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
}
}
答案 0 :(得分:0)
你想在那里只显示喜欢的数据吗?
根据你在上面显示的那样,你有一系列的dictonary。
您可以使用谓词过滤该数组。
你只能获得isFavourite ==“True”的对象
使用下面的函数传递数组的位置,传递keyofDict - isFavourite
strSearchText - 您的示例使用 true
from itertools import product
def crp0(iterable, r):
for f in product(iterable, repeat=r):
last = f[0]
b = True
for element in f[1:]:
if element == last:
b = False
break
last = element
if b:
yield f
for no_repetition in crp0([0, 1, 2], 12):
print(no_repetition)
# (0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1)
# (1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0)