搜索栏刷新我的表格视图单元格的索引

时间:2017-10-19 13:48:30

标签: ios swift xcode

我正在开发一个汽车租赁应用,它接受用户的输入并将其放入我的SQLite数据库。

在我的tableview viewcontroller中,它正在显示信息。

示例:

Cell 1: Toyota, Philippines, 5000
Cell 2: Nissan, America, 1000
Cell 3: Mitsubishi, England, 2000

问题是,每当我搜索时,例如我搜索了“英格兰”,它显示的唯一正确的数据只是位置。所以它会显示如下:

Cell 1: Toyota, England, 5000

Toyota5000来自索引0。唯一正确的数据是英格兰。

每当我搜索“英格兰”时,我想要的结果: Cell 1: Mitsubishi, England, 2000

请帮我修理车型和速率以便显示它。

这是我的表视图控制器中的代码:

import UIKit
import SQLite

class CarList: UIViewController, UITableViewDataSource, UITableViewDelegate, 
UISearchBarDelegate {
@IBOutlet var tableView: UITableView!
@IBOutlet var searchBar: UISearchBar!


//variables I used to append my database
var carType = [String]()
var rate = [String]()  
var location = [String]()

//variables I used to append my filtered data for searchbar
var filteredLocation: [String]!
var filteredCar: [String]!
var filteredRate: [String]!


var img = [UIImage(named: "Toyota"), UIImage(named: "Nissan")]

override func viewDidLoad() {
    super.viewDidLoad()


    searchBar.placeholder = "Search Location"


    do{

        let documentDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)

        let fileUrl = documentDirectory.appendingPathComponent("users").appendingPathExtension("sqlite3")
        let database = try Connection(fileUrl.path)
        Variables.database = database

    }catch {
        print(error)
    }


    //appending my database to my array

    do{

        let users = try Variables.database.prepare(Variables.rTable)

        for user in users {

            carType.append(user[Variables.rCar])
            rate.append(user[Variables.rRate])
            location.append(user[Variables.rLocation])         
        }

    }catch{
        print(error)
    }
    searchBar.delegate = self

//assigning the array to filtered data

    filteredLocation = location
    filteredCar = carType
    filteredRate = rate    
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return filteredLocation.count

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CarListCell

    cell.carType.text = "Car Type: " + filteredCar[indexPath.row]
    cell.rate.text = "Location: " + filteredLocation[indexPath.row]
    cell.carImage.image = UIImage(named: filteredCar[indexPath.row]+".jpg")
    return (cell)

}


func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    filteredLocation = searchText.isEmpty ? location : location.filter({(dataString: String) -> Bool in


        return dataString.range(of: searchText, options: .caseInsensitive) != nil



    })

    tableView.reloadData()

}


//below is the code when I clicked on the table view cell, it will pass the data. 
//but the filtered location is the only one working.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "info" {

        if let indexPath = self.tableView.indexPathForSelectedRow {

        let controller = segue.destination as! CarInfo

        controller.getCar = filteredCar[indexPath.row]
        controller.getRate = filteredRate[indexPath.row]
        controller.getLocation = filteredLocation[indexPath.row]

        }
    }
}   
} // End Class

这是我的数据库表,如果你需要它,我使用Variables.swift将它分开。

import Foundation
import UIKit
import SQLite

class Variables: UIViewController{

    var database: Connection!

    let rTable = Table("rTable")
    let rId = Expression<Int>("rId")
    let rCar= Expression<String>("rCar")
    let rLocation = Expression<String>("rLocation")
    let rRate = Expression<String>("rRate")

}

1 个答案:

答案 0 :(得分:0)

不是为数据创建3个数组,而是为它们创建对象

class Car{
var carType:String?
var location:String?
var rate:String?
}

然后

var filteredLocation: [String]!
var filteredCar: [String]!
var filteredRate: [String]!

制作本

var cars = [Car]()

而不是

 for user in users {

            carType.append(user[Variables.rCar])
            rate.append(user[Variables.rRate])
            location.append(user[Variables.rLocation])         
        }

制作本

 for user in users {
          let car = Car()
          car.carType = user[Variables.rCar]
          car.location = user[Variables.rLocation]
          car.rate = user[Variables.rRate]
          cars.append(car)      
        }

和cellForRow将其更改为

  cell.carType.text = "Car Type: " + cars[indexPath.row].carType
    cell.rate.text = "Location: " + cars[indexPath.row].rate
    cell.carImage.image = UIImage(named: cars[indexPath.row].carType+".jpg")

重要的是

filteredCars = cars.filter{
$0.carType.lowercased == searchText.lowercased}
}

其中filteredCars是汽车对象的数组。希望这能帮助你。