ios - TableView 的 UISearchController

标签 ios swift uitableview text-files uisearchcontroller

这就是我的表格 View 的样子。每个单元格字符串来自 .txt 的文本 enter image description here

搜索过滤器工作正常。但是当我选择其中一个结果时,例如“How”它会打印“Hello”的内容。 enter image description here

我认为这可能是因为“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/

相关文章:

android - Visual Studio 2015 移动跨平台

ios - SwiftUI 错误修复 "Cannot convert value of type ' 绑定(bind)<int >'to expected type ' 绑定(bind)<_> ?'"

ios - 谷歌地图自动完成改变颜色

ios - 在 xcode 8 中使用 Swift 3 出现未知错误 - "Editor placeholder in source file"

ios - 登录 Facebook FBSDK 输入错误代码 : 308 in Swift 4. 2

arrays - SWIFT 单元格填充

IOS如何更新UITableViewCell

ios - 当 UITextField 触发时同步向上滑动 UIView 并调整 UITableView 大小

ios - 如何修复 [!] 在 `flutter_test` 中找不到 `.symlinks/plugins/flutter_test/ios` 的 podspec

ios - Realm :重新排列对象列表