搜索时的tableview错误

时间:2016-02-18 11:37:25

标签: ios arrays swift uitableview

嗨我有两个数组,只有一个数组正在用搜索栏更新..我保持TitleArray显示在tableView标题和detailsArray中显示在tableView字幕..一旦我开始只搜索标题后输入我的字幕但字幕没有变化

@IBOutlet weak var AirportsTableView:UITableView!

var TitleArray = [String]()
var DetailsArray = [String]()

var NumberOfRows = 0


var filteredNamesArray = [String]()
var filteredDetailsArray = [String]()
var resultSearchController = UISearchController!()




**override func viewDidLoad() {
    super.viewDidLoad()**

    // Do any additional setup after loading the view.


    self.resultSearchController = UISearchController(searchResultsController: nil)
    self.resultSearchController.searchResultsUpdater = self

    self.resultSearchController.dimsBackgroundDuringPresentation = false
    self.resultSearchController.searchBar.sizeToFit()
    self.resultSearchController.loadViewIfNeeded()

    self.AirportsTableView.tableHeaderView = self.resultSearchController.searchBar

    self.AirportsTableView.reloadData()


    parseJSON()

}


func parseJSON() {

    if let path = NSBundle.mainBundle().pathForResource("airports", ofType: "json") {
        do {
            let data = try NSData(contentsOfURL: NSURL(fileURLWithPath: path), options: NSDataReadingOptions.DataReadingMappedIfSafe)
            let jsonObj = JSON(data: data)
            if jsonObj != JSON.null {
            // print("jsonData:\(jsonObj)")


                NumberOfRows = jsonObj.count

                for i in 0...NumberOfRows {

                    let City = jsonObj[i]["city"].string as String!
                    let Country = jsonObj[i]["country"].string as String!
                    let Iata = jsonObj[i]["iata"].string as String!
                    let Name = jsonObj[i]["name"].string as String!


                    self.TitleArray.append("\(City) - \(Country) - \(Iata)")
                    self.DetailsArray.append("\(Name)")

                }


            } else {
                print("could not get json from file, make sure that file contains valid json.")
            }
        } catch let error as NSError {
            print(error.localizedDescription)
        }
    } else {
        print("Invalid filename/path.")
    }

}



override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
}
*/



// MARK: - Table view data source

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections

    return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows


    if self.resultSearchController.active

    {
        return self.filteredNamesArray.count

    } else

    {

        return self.TitleArray.count
    }
}


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell?


    if self.resultSearchController.active
    {
        cell!.textLabel?.text = self.filteredNamesArray[indexPath.row]

    } else
    {
        cell!.textLabel?.text = self.TitleArray[indexPath.row]
        cell!.detailTextLabel?.text = self.DetailsArray[indexPath.row]
    }


    return cell!
}

func updateSearchResultsForSearchController(searchController: UISearchController) {

    self.filteredNamesArray.removeAll(keepCapacity: false)

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)

    let array = (self.TitleArray as NSArray).filteredArrayUsingPredicate(searchPredicate)

    self.filteredNamesArray = array as! [String]

    self.AirportsTableView.reloadData()
}


// MARK: - Segues

/*

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "AirportDetails" {
        if let indexPath = self.AirportsTableView.indexPathForSelectedRow {
            let airportDetail : Airports = TitleArray[indexPath.row]
            let controller = (segue.destinationViewController as! UINavigationController).topViewController as! AllWaysFlightsViewController
            controller.airportDetail = airportDetail
            controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
            controller.navigationItem.leftItemsSupplementBackButton = true
        }
    }
}


*/

2 个答案:

答案 0 :(得分:1)

不使用两个单独的数组,而只使用一个数组,并使用包含用于填充tableView的两个变量的对象填充它。

class Address {
    var city: String
    var detail: String

    init(city: String, detail:String) {
        self.city = city
        self.detail = detail
    }
}

解析你的json:

for i in 0...NumberOfRows {

                    let City = jsonObj[i]["city"].string as String!
                    let Country = jsonObj[i]["country"].string as String!
                    let Iata = jsonObj[i]["iata"].string as String!
                    let Name = jsonObj[i]["name"].string as String!

                    let city = "\(City) - \(Country) - \(Iata)"

                    let address = Address(city: city, detail: Name)
                    self.TitleArray.append(address)
                    self.filteredNamesArray.append(address)
                }

过滤包含地址的标题数组。你的titlearray和过滤数组都包含相同的数据,这是你第一次可以参考json解析。在这里你可以使用一个进行过滤,当搜索栏为空时,用户取消他的搜索,你可以从另一个中重新填充你的数组。

func updateSearchResultsForSearchController(searchController: UISearchController) {

    self.filteredNamesArray.removeAll(keepCapacity: false)

    let searchPredicate = NSPredicate(format: "SELF.city CONTAINS[c] %@", searchController.searchBar.text!)

    let array = (self.TitleArray as NSArray).filteredArrayUsingPredicate(searchPredicate)

    self.filteredNamesArray = array as! [Address]

    self.AirportsTableView.reloadData()
}

你的tableView逻辑将相应更改

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows

      return self.filteredNamesArray.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell?

        let address = self.filteredNamesArray[indexPath.row]
        cell!.textLabel?.text = address?.city
        cell!.detailTextLabel?.text = address?.detail

    return cell!
}

答案 1 :(得分:0)

您需要更改过滤数据的方式,以便不是仅应用显式迭代并检查谓词的谓词,如果找到匹配项,则将该项和相应的描述带入过滤后的数组中。 / p>

类似的东西:

func updateSearchResultsForSearchController(searchController: UISearchController) {

    self.filteredNamesArray.removeAll(keepCapacity: false)
    self.filteredDetailsArray.removeAll(keepCapacity: false)

    let searchString = searchController.searchBar.text!
    var index = 0

    for title in self.TitleArray
        if title.rangeOfString(searchString).location != NSNotFound {
            self.filteredNamesArray.append(title)
            self.filteredDetailsArray.append(self.DetailsArray[index])
        }

        index += 1
    }

    self.AirportsTableView.reloadData()
}