用于TableView的UISearchController

这就是我的Table View的样子。 每个单元格从.txt中对字符串进行字符串处理 在此处输入图像描述

搜索filter工作正常。 但是当我选择其中一个结果时,例如“How”,它会打印出“Hello”的内容。 在此处输入图像描述

我想这可能是因为“Hello”被编程为第一个String,所以它总是单击时第一个单元格的结果。 我需要帮助找出搜索结果如何与其自己的内容相关联。 如果那有意义的话?

这是下面的代码。 代码从.txt文件中读取swell作为搜索文本文件。 单击时的结果不匹配。

导入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] } } 

欢迎任何帮助,提前谢谢。

问题出在你的准备论坛上。 您需要修改它以测试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] } } 

songTitleSongTitle ,变量名称应该以小写字母开头 – songTitle而不是SongTitle等)。

您可以通过从数组中搜索所选字符串的位置在didSelectRowAtIndexPath中手动执行segue,然后您就可以获得正确的位置 –

示例 –

 func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) { let Cell: AnyObject = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) let str: String= Cell.textLabel.text // now find str in array and then get position int pos = getPositionOfStringInArray(str) // now perform segue for pos //code... }