簡體   English   中英

搜索時出現tableview錯誤

[英]tableview error while searching

嗨,我有兩個數組,並且只有一個數組正在用搜索欄更新。.我保留TitleArray以顯示在tableView標題中,而detailsArray以顯示在tableView字幕中。

@IBOutlet弱變量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
        }
    }
}


*/

而不是僅使用一個數組,而是使用包含兩個變量的對象填充該數組,而不是使用兩個單獨的數組來填充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和filter數組都首次包含相同的數據,您可以為此參考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!
}

您需要更改過濾數據的方式,以使您不僅可以應用謂詞,還可以顯式地迭代並檢查謂詞,如果找到匹配項,則可以將該項目和相應的描述帶入已過濾的數組中。

就像是:

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()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM