使用NSPredicate将启用用户添加到“收藏夹”#39;对象,然后将出现在单独的TableView中(没有CoreData!)

时间:2017-07-05 10:29:59

标签: swift xcode sorting nspredicate predicate

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

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

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

我已经在detailView设置了收藏夹按钮,该按钮会将变量isFavouritefalse设置为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
    }
}

1 个答案:

答案 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)