2016-07-29 54 views
1

我有JSON数据。我正在与SwiftyJSON。我的数据是这样的:Swift:过滤表格中的SwiftyJSON数据

[{ 
    "kode_customer": 1, 
    "nama_customer": "Logam Jaya, UD", 
    "alamat_customer": "Rajawali No 95", 
    "kodepos": 60176, 
    "kode_provinsi": 11, 
    "gps_lat": -7.233834999999999, 
    "gps_long": 112.72964666666667 
}, { 
    "kode_customer": 2, 
    "nama_customer": "Terang, TK", 
    "alamat_customer": "Raya Dukuh Kupang 100", 
    "kodepos": 60225, 
    "kode_provinsi": 11, 
    "gps_lat": -7.285430000000001, 
    "gps_long": 112.71538333333335 
}, { 
    "kode_customer": 3, 
    "nama_customer": "Sinar Family", 
    "alamat_customer": "By Pass Jomin No 295", 
    "kodepos": 41374, 
    "kode_provinsi": 9, 
    "gps_lat": -6.4220273, 
    "gps_long": 107.4748978 
}, { 
    "kode_customer": 4, 
    "nama_customer": "Lancar Laksana, TB", 
    "alamat_customer": "Jendral Sudirman No 69", 
    "kodepos": 41374, 
    "kode_provinsi": 9, 
    "gps_lat": -6.4220273, 
    "gps_long": 107.4748978 
}] 

如何显示它tableView和使用UISearchController过滤。这里是我的代码:

class LocationSearchTable: UITableViewController { 

    var custData: JSON = [] 
    var filteredData: [String]! 

    func getCustData() { 
     let path = NSBundle.mainBundle().pathForResource("cust_toko", ofType: "json") 
     let jsonData = NSData(contentsOfFile: path!) 
     let json = JSON(data: jsonData!) 

     self.custData = son 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return filteredData.count 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("cell")! 
     cell.textLabel?.text = filteredData[indexPath.row] 
     return cell 
    } 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     print(filteredData[indexPath.row]) 
    } 
} 

extension LocationSearchTable: UISearchResultsUpdating { 
    func updateSearchResultsForSearchController(searchController: UISearchController) { 
     if let searchText = searchController.searchBar.text { 
      let searchPredicate = NSPredicate(format: "name contains[cd] %@", searchText) 
      filteredData = JSON(custData.filter{ JSON.Value() }) 

      tableView.reloadData() 
     } 
    } 
} 

它得到的错误是这样的:'Value' (aka 'AnyObject') cannot be constructed because it has no accessible initializers

这里是链接到github上对这个问题https://github.com/lamfete/MapSearchDemo

回答

0

我想回答我自己的问题。

import Foundation 
import UIKit 
import SwiftyJSON 
import MapKit 

class LocationSearchTable: UITableViewController { 

    var custData: JSON = [] 
    var dbTokos : [Toko] = [] 
    var filteredDataToko: [Toko]! 

    var handleMapSearchDelegate: HandleMapSearch? = nil 
    var vc = ViewController() 

    func getCustData() { 
     let path = NSBundle.mainBundle().pathForResource("cust_toko", ofType: "json") 
     let jsonData = NSData(contentsOfFile: path!) 
     let json = JSON(data: jsonData!) 

     self.custData = Jon 

     splitData() 
} 

    func splitData() { 
     for(_, subJson):(String, JSON) in self.custData { 
      if let name: String = subJson["nama_customer"].stringValue { 
       if let address: String = subJson["alamat_customer"].stringValue { 
        if let city: String = subJson["kota"].stringValue { 
         if let province: String = subJson["provinsi"].stringValue { 
          if let lat: Double = subJson["gps_lat"].doubleValue { 
           if let long: Double = subJson["gps_long"].doubleValue { 
            let toko = Toko(title: name, 
               locationName: address, 
               cityName: city, 
               provinsiName: province, 
               coordinate: CLLocationCoordinate2D(latitude: lat, longitude: long)) 
            dbTokos.append(toko) 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return filteredDataToko.count 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("cell")! 
     cell.textLabel!.text = String(filteredDataToko[indexPath.row].title!) 
     cell.detailTextLabel!.text = String(filteredDataToko[indexPath.row].locationName) + ", " + String(filteredDataToko[indexPath.row].cityName) + ", " + String(filteredDataToko[indexPath.row].provinsiName) 
     return cell 
    } 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     let toko = Toko(title: filteredDataToko[indexPath.row].title!, 
         locationName: filteredDataToko[indexPath.row].locationName, 
         cityName: filteredDataToko[indexPath.row].cityName, 
         provinsiName: filteredDataToko[indexPath.row].provinsiName, 
         coordinate: filteredDataToko[indexPath.row].coordinate) 

     handleMapSearchDelegate?.dropPinZoomIn(toko) 
     dismissViewControllerAnimated(true, completion: nil) 
    } 
} 

extension LocationSearchTable: UISearchResultsUpdating { 
    func updateSearchResultsForSearchController(searchController: UISearchController) { 
     if let searchText = searchController.searchBar.text { 
      filteredDataToko = searchText.isEmpty ? dbTokos : dbTokos.filter(
       { 
        (dataString: Toko) -> Bool in 
        return dataString.title?.rangeOfString(searchText, options: .CaseInsensitiveSearch) != nil 
       } 
      ) 
      tableView.reloadData() 
     } 
    } 
} 
+0

为什么从字符串初始化字符串('title','locationName'等似乎是字符串呢)? – vadian

+0

所以它不会是可选的 – lamfete

2

首先,你需要经过从JSON对象获得阵列arrayObject你需要将你的谓词键name更改为customer_name,因为在你的json响应中没有key名称,所以你可以像这样改变你的代码,只从该结果中获取customer_name。

extension LocationSearchTable: UISearchResultsUpdating { 
    func updateSearchResultsForSearchController(searchController: UISearchController) { 
     if let searchText = searchController.searchBar.text { 
      let searchPredicate = NSPredicate(format: "nama_customer contains[cd] %@", searchText) 
      if let array = custData.arrayObject as? [[String:AnyObject]] { 
       let filterArr = array.filter{ searchPredicate.evaluateWithObject($0) } 
       filteredData = filterArr.map({ String($0["nama_customer"])}) 
       tableView.reloadData() 
      } 
     } 
    } 
} 
+0

嗨,它有2个错误。 第一个错误是'Value'(又名'AnyObject')不能被构造,因为它没有'let filterArr = JSON(custData.filter {JSON.Value()}'的可访问初始化符'' 第二个错误是'filterData = filterArr.map {$ 0 [“nama_customer”]}'使用未解析的标识符filterData''' – lamfete

+0

错误'不能将类型'Element'(aka'(String,JSON)')的值转换为预期的参数类型''AnyObject?''出现在'let filterArr = JSON(custData.filter {searchPredicate.evaluateWithObject($ 0)})'指向'$ 0' – lamfete

+0

仍然错误,先生'类型'元素'(aka'(String,JSON)'' )在'filteredData = filterArr.map {$ 0 [“nama_customer”]}'上没有下标成员'我在[“nama_customer”]后面添加了.stringValue,但仍然错误。 – lamfete