ios - 搜索和表格 View

标签 ios swift uitableview swift2

我需要一点帮助。 祝大家平安,希望你们做得很好。

我用表格 View 制作了一个应用程序,我想向我的表格 View 添加一个搜索栏,所以我找到了一个如何将搜索栏添加到表格 View 的教程,但在教程中它只是一个包含项目的列表,而不是当你输入那些将您移动到带有 TextView 的 View Controller 的项目。与教程不同,我的应用程序是这样的,当您键入其中一项时,它们会将您移动到带有 TextView 的 View Controller 。但更好的是你可以看到我的 tablview 的样子: [![在此处输入图像描述][1]][1]

它看起来不错,当我使用搜索栏时它也看起来不错:

[![在此处输入图像描述][2]][2]

但问题是,当您使用搜索时,它会为我提供来自不同变量的不同数据,如图所示: [![在此处输入图像描述][3]][3]

希望我说得很清楚,并希望有人能向我解释如何解决这个问题。

和平。

这是我的 tablview 代码:

import UIKit

class TableViewController: UITableViewController, UISearchResultsUpdating {

    var FirstTableArray = [String]()
    var passThisArray = [String]()

    var filteredVerbs = [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()




        // This array will display on your tableviewcell.
        FirstTableArray = [åadlyde, åanbefale, åansette, åarbeide, åavslå, åavstå, åbade, åbanke, åbarbere, åbe, åbearbeide, åbedra, åbedøve, åbegynne, åbehandle, åbeite, åbeskrive, åbestemme…]

        //You can pass element of this array
        passThisArray = ["å adlyde", "å anbefale", "å ansette", "å arbeide", "å avslå", "å avstå", "å bade", "å banke", "å barbere", "å be", "å bearbeide", "å bedra", "å bedøve", "å begynne", "å behandle"…]

    }


    override func didReceiveMemoryWarning()
    {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int
    {
        return 1
    }



    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        if(passThisArray.count > 3){




            if (self.resultSearchController.active)
            {
                return self.filteredVerbs.count;

            }
            else
            {
            return self.passThisArray.count
            }

        }

    return FirstTableArray.count


    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {


        let Cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell

        Cell.textLabel?.text = passThisArray[indexPath.row]


        if (self.resultSearchController.active)
        {
            Cell.textLabel?.text = self.filteredVerbs[indexPath.row]

            return Cell

        }
        else
        {
            Cell.textLabel?.text = self.passThisArray[indexPath.row]

            return Cell

        }


    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if(segue.identifier == "detailView") {
            let vc = segue.destinationViewController as! ViewwController

            //Get the Index of selected Cell
            var indexPath : NSIndexPath = self.tableView.indexPathForSelectedRow!

            //assign string to next view controller instance from selected cell.
            vc.FirstString = FirstTableArray[indexPath.row]

            if (self.resultSearchController.active) {

                vc.FirstString = FirstTableArray[filteredVerbs.count]

            }

        }


    }


    func updateSearchResultsForSearchController(searchController: UISearchController)
    {
        self.filteredVerbs.removeAll(keepCapacity: false)

        let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
        let array = (self.passThisArray as NSArray).filteredArrayUsingPredicate(searchPredicate)
        self.filteredVerbs = array as! [String]

        self.tableView.reloadData()
    }
}

最佳答案

所以看来你的问题出在这个方法上,在所选的行中:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if(segue.identifier == "detailView") {
            let vc = segue.destinationViewController as! ViewwController

            //Get the Index of selected Cell
            var indexPath : NSIndexPath = self.tableView.indexPathForSelectedRow!

            //assign string to next view controller instance from selected cell.
            vc.FirstString = FirstTableArray[indexPath.row]

            if (self.resultSearchController.active) {

                vc.FirstString = FirstTableArray[filteredVerbs.count] // <<---

            }
        }
    }

如果搜索处于事件状态,您应该以 self.filteredVerbs[indexPath.row] 的方式获取 FirstString

<小时/>

根据评论了解: 似乎没有简单的方法可以在这两个数组中存储的值之间进行映射。

此外,这也不是存储这些数据的理想方式。它不灵活,并且将数据与表示混合在一起,通常应该避免这种情况。我建议创建一个结构来存储数据,如下所示:

class Flexion : NSObject {
    var infinitiv:String = ""
    var presens:String = ""
    var preteritum:String = ""
    var perfektum:String = ""
    var english:String = ""

    init(infinitiv:String, presens:String, preteritum:String, perfektum:String, english:String) {
        self.infinitiv = infinitiv
        self.presens = presens
        self.preteritum = preteritum
        self.perfektum = perfektum
        self.english = english
    }
}

您的情况的主要好处是只有一个包含 TableView 来源对象的数组。整个事情也会变得更具可读性,并且更容易进一步维护。

所以你原来问题的代码将变成这样:

class TableViewController: UITableViewController, UISearchResultsUpdating {

    var FirstTableArray = [Flexion]()
    var filteredVerbs = [Flexion]()

    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

        //create your objects like this :
        var åadlyde = Flexion(infinitiv: "å adlyde", presens: "adlyder", preteritum: "adlød", perfektum: "har adlydt", english: "obey")
        //create the rest of them

        FirstTableArray = [åadlyde, åanbefale, åansette, åarbeide, åavslå, åavstå, åbade, åbanke, åbarbere, åbe, åbearbeide, åbedra, åbedøve, åbegynne, åbehandle, åbeite, åbeskrive, åbestemme…]
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        if (self.resultSearchController.active) {
            return self.filteredVerbs.count
        }

        return FirstTableArray.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let Cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell

        if (self.resultSearchController.active) {
            let verb = self.filteredVerbs[indexPath.row] as Flexion
            Cell.textLabel?.text = verb.infinitiv
        } else {
            let verb = self.FirstTableArray[indexPath.row] as Flexion
            Cell.textLabel?.text = verb.infinitiv
        }
        return Cell
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if(segue.identifier == "detailView") {
            let vc = segue.destinationViewController as! UIViewController
            var indexPath : NSIndexPath = self.tableView.indexPathForSelectedRow!

            if (self.resultSearchController.active) {
                vc.verb = filteredVerbs[indexPath.row]
            } else {
                vc.verb = FirstTableArray[indexPath.row]
            }
        }

    }

    func updateSearchResultsForSearchController(searchController: UISearchController) {
        self.filteredVerbs.removeAll(keepCapacity: false)

        let searchPredicate = NSPredicate(format: "SELF.infinitiv CONTAINS[c] %@", searchController.searchBar.text!)
        let array = (self.FirstTableArray as NSArray).filteredArrayUsingPredicate(searchPredicate)
        self.filteredVerbs = array as! [Flexion]

        self.tableView.reloadData()
    }
}

您还需要在 "detailView" View Controller 中进行必要的更改 - 添加 Flexion 类型的 verb 变量并更改向用户呈现数据的方式。

这样,数组之间就不需要这种“映射”了。

注意:请注意 NSPredicate 中的更改 - 它现在将仅检查单词的 infinitiv 版本。

关于ios - 搜索和表格 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33895546/

相关文章:

ios - 模拟器 clang : error: no such file or directory: '__entitlements' 上的 Xcode 构建错误

ios - 安装后如何定位Xcode(Xcode beta)?

object - Swift - 在 NSArray 中插入对象/项目/添加对象/项目

ios - 在 Collection View 中不失真地显示图像的正确方法是什么

ios - 为什么我需要在 UITableViewCell 中指定重用标识符?

ios - 为什么在交互和滚动时 UITableView 会发生内存泄漏?

ios - clearsSelectionOnViewWillAppear 有什么作用?

ios - xcassets : A XXxXX app icon is required for iPhone apps targeting releases of iOS prior to 7. 0

swift - 如何在 Swift 中管理 ViewController 之间的状态?

ios - 在 iOS 8/9 中根据设备方向更改 Viewcontroller