2017-10-19 3 views
0

Je travaille sur une application de location de voiture, qui accepte l'entrée de l'utilisateur et de le mettre dans ma base de données SQLite.Barre de recherche rafraîchit l'index de ma cellule de vue de table

À l'intérieur de mon viewview viewcontroller, il affiche les informations très bien.

Exemple:

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

Le problème est, chaque fois que je cherche, par exemple, je cherchais la « angleterre », les seules données à droite, il affiche seulement l'emplacement. Donc, il affiche comme ceci:

Cell 1: Toyota, England, 5000

qui est Toyota et 5000 vient de l'indice 0. et la seule bonne donnée est l'Angleterre.

Mon résultat désiré chaque fois que je recherche « angleterre »: Cell 1: Mitsubishi, England, 2000

S'il vous plaît me aider à fixer le type de voiture et la vitesse de l'afficher aussi.

Ceci est mon code dans mon contrôleur de vue de la table:

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 

Et voici ma table de base de données dans le cas où vous avez besoin, je me suis séparé à l'aide 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") 

} 
+0

Où vous utilisez la variable filteredData? – Hosny

+0

désolé qui est censé être filterLocation, mais à l'origine filterData mais je l'ai édité pour l'expliquer facilement. –

+0

Ok le problème est l'emplacement et le type de voiture sont séparés du pays alors vous devriez les faire – Hosny

Répondre

0

Plutôt que de faire 3 tableaux pour vos données, vous pouvez faire l'objet pour les

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

Alors plutôt

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

font de cette

var cars = [Car]() 

et plutôt que

for user in users { 

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

faire ce

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

et cellForRow changer à

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") 

et la chose importante est que

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

où filteredCars est un tableau d'objet de voiture. J'espère que cela vous aidera.

+0

où dois-je mettre filterCars = cars.filter { $ 0.carType.lowercased == searchText.lowercased} } –

+0

dans la méthode searchBar plutôt que filteredLocation = searchText.isEmpty? location: location.filter ({(dataString: String) -> Bool dans return dataString.range (de: searchText, options: .caseInsensitive)! = }) – Hosny

+0

et à l'intérieur de la méthode numberOfRowsInSection je vais retourner les cars.count à droite ? Merci beaucoup! –