这就是我的表格 View 的样子。每个单元格字符串来自 .txt 的文本
搜索过滤器工作正常。但是当我选择其中一个结果时,例如“How”它会打印“Hello”的内容。
我认为这可能是因为“Hello”被编程为第一个字符串,因此单击时它始终是第一个单元格的结果。我需要帮助来弄清楚搜索结果如何链接到它自己的内容。如果那有意义的话?
下面是代码。该代码从 .txt 文件读取并搜索文本文件。单击时的结果不匹配。
导入UIKit
class title_ViewController: UITableViewController, UISearchResultsUpdating {
var SongTitle = [String]()
var SongLyrics = [LText]()
var filteredSongs = [String]()
var resultSearchController = UISearchController()
override func viewDidLoad() {
super.viewDidLoad()
self.resultSearchController = UISearchController(searchResultsController: nil)
self.resultSearchController.searchResultsUpdater = self
self.resultSearchController.dimsBackgroundDuringPresentation = false
self.resultSearchController.searchBar.sizeToFit()
self.tableView.tableHeaderView = self.resultSearchController.searchBar
self.tableView.reloadData()
if let path = NSBundle.mainBundle().pathForResource("DataBase", ofType: "txt"){
do {
let stringFromFile = try String(contentsOfFile:path, encoding: NSUTF8StringEncoding)
var Title: [String] = stringFromFile.componentsSeparatedByString("@")
Title.removeAtIndex(0)
//Seperates the Title from the Lyrics
var t1 = Array(Title[0].componentsSeparatedByString("^"))
t1.removeAtIndex(0)
SongTitle = Title
SongLyrics = [LText(LyricsText: t1)]
}catch{
print(error)
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if self.resultSearchController.active{
return self.filteredSongs.count
}else{
return self.SongTitle.count
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let Cell: AnyObject = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
Cell.textLabel?!.text = SongTitle[indexPath.row]
if self.resultSearchController.active{
Cell.textLabel?!.text = self.filteredSongs[indexPath.row]
}else{
Cell.textLabel?!.text = self.SongTitle[indexPath.row]
}
return Cell as! UITableViewCell
}
func updateSearchResultsForSearchController(searchController: UISearchController) {
self.filteredSongs.removeAll(keepCapacity: false)
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c]%@", searchController.searchBar.text!)
let array = (self.SongTitle as NSArray).filteredArrayUsingPredicate(searchPredicate)
self.filteredSongs = array as! [String]
self.tableView.reloadData()
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let indexPath: NSIndexPath = self.tableView.indexPathForSelectedRow!
let DestViewController = segue.destinationViewController as! ViewController
DestViewController.LyricString = SongTitle[indexPath.row]
}
}
欢迎任何帮助,提前致谢。
最佳答案
问题出在你的prepareForSegue
上。您需要修改它来测试searchController是否处于事件状态。如果是这样,您应该使用 filteredSongs
来确定将哪首歌曲传递到目标 VC,而不是 SongTitle
:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let indexPath: NSIndexPath = self.tableView.indexPathForSelectedRow!
let DestViewController = segue.destinationViewController as! ViewController
if self.resultSearchController.active {
DestViewController.LyricString = self.filteredSongs[indexPath.row]
}else{
DestViewController.LyricString = self.SongTitle[indexPath.row]
}
}
(顺便说一句,变量名应以小写字母开头 - songTitle
而不是 SongTitle
等)
关于ios - TableView 的 UISearchController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34680811/