2017-07-05 6 views
0

私は現在、JSONファイルのデータを解析して表示するtableViewを持っています。セルが押されると、ユーザーはdetailView画面に移動し、詳細情報を表示します。NSPredicateを使用して、 'Favorite'オブジェクトにユーザを追加し、別のTableView(CoreDataなし)に表示されます。

私は今、ユーザーがfavouriteView(これはtableViewと全く同じ設定、だけ表示される場所にオブジェクトを追加しますボタンを押すことができるように、detailViewFavouriteボタンを設定しようとしています

これを達成する最も良い方法は、NSPredicateを使用することです。私は何時間も探していましたが、私はCoreDataの解決策を見つけることができませんでした。 CoreDataは必要ではないというソースを見つけました)CoreDataを使わずにFavouriteの機能を達成したいと考えています。

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

お気に入りのデータだけを表示したいですか?

あなたはあなたが上記に示しているように二桁の配列を持っています。

述語を使用してその配列をフィルタリングできます。

、あなたはisFavouriteが

場所の関数パスの配列、パスkeyofDict下記の使用== "True" にのみオブジェクトを取得することができます - strSearchText

isFavourite

- ご例えば

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 
    } 
を使用します
+0

ありがとう!しかし、どこでこれを実装すべきですか?私はそれを試して、それは動作するように見えませんでした。私がFavouriteLocationViewControllerのコードを含む質問に加えた編集を見てください。 – joshlorschy

関連する問題