Je construis une application de dictionnaire iOS. Je crée une vieilletable avec une barre de recherche pour rechercher les mots et afficher les résultats de la recherche comme saisi. Par exemple, si les types d'utilisateurs dans "App" ", la vieilletable doit afficher" App, Apple, Appliquer ", etc. Heres ce que j'ai, s'il vous plaît aider et merci.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var searchBar: UISearchBar!
@IBOutlet weak var tableView: UITableView!
var wordSearch = [String]()
var searching = false
var wordArray: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let url = Bundle.main.url(forResource: "words_alpha", withExtension: "txt")! // file URL for file "words_alpha.txt"
do {
let string = try String(contentsOf: url, encoding: .utf8)
wordArray = string.components(separatedBy: CharacterSet.newlines)
} catch {
print(error)
}
}
}
extension ViewController: UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if searching {
return wordArray.count
} else {
return wordArray.count
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell");cell?.textLabel?.text = wordArray[indexPath.row]
if searching {
cell?.textLabel?.text = wordSearch[indexPath.row] //Thread 1: Fatal error: Index out of range
} else {
cell?.textLabel?.text = wordSearch[indexPath.row]
}
return cell!
}
}
extension ViewController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
wordSearch = wordArray.filter({$0.prefix(searchText.count) == searchText;})
searching = true
tableView.reloadData()
}
}
3 Réponses :
Vous définissez un nombre de tableau et indexez l'autre 1 ici p> alors utilisez p> if searching {
cell?.textLabel?.text = wordSearch[indexPath.row] //Thread 1: Fatal error: Index out of range
} else {
cell?.textLabel?.text = wordArray[indexPath.row]
}
Merci. Il n'y a pas d'erreur, cependant, la vision de la table est vide lorsque je commence à taper la barre de recherche sur le simulateur. Il semble que le tableau soit vide. une idée?
The above answer is right .
Adding to it. The search filtering g method seems to be wrong
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
**wordSearch = wordArray.filter({$0.prefix(searchText.count) == searchText;})**
searching = true
tableView.reloadData()
}
Instead use **wordArray.filter({$0.contains(searchText)})**
And on clearing the search bar . Reset searching = false and empty the wordSearch array.
Check whether you need to set the searchBar.delegate = self in viewDidLoad.
Tout d'abord, vous devez gérer le cas si le champ de recherche est vide.
et il existe une syntaxe plus efficace et fiable pour filtrer la gamme: pour corriger l'erreur que vous devez obtenir les données de de la plage (de code> peut filtrer insensibles à filtrer insensibles et à partir du début de la chaîne ( ancré code>) simultanément. p> wordsarch ou Wordarray code> en fonction de Recherche code>. Remplacer NumberfrowSectionSection code> et celltforat code> avec p> func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return searching ? wordSearch.count : wordArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for indexPath)
let word = searching ? wordSearch[indexPath.row] : wordArray[indexPath.row]
cell.textLabel?.text = word
return cell
}
MERCI! J'avais des difficultés avec la capitalisation, vous êtes génial.