ios - UISearchBar搜索功能不起作用

标签 ios iphone swift uitableview uisearchbar

我尝试在这个 iOS 应用程序上实现搜索功能已经有一段时间了。

我有一个包含所有数据的 JSON 文件,然后将其拉出并显示到 TableView Controller 上。

我已经实现了搜索栏并遵循了几个教程,这个教程的问题最少 - http://www.ioscreator.com/tutorials/add-search-table-view-tutorial-ios8-swift (我以前也用过这个 - https://www.youtube.com/watch?v=N9wcKc37ZXI )

我的 JSON 文件的结构如下:

{ "animal":[

    {
        "no":"001",
        "type":"dog",
        "breed":"pitbull",
        "classification":"mammal",
        "sprite":"beast"
    },
    {
        "no":"002",
        "type":"dog",
        "breed":"bulldog",
        "classification":"mammal",
        "sprite":"beast"
     },
    {
        "no":"003",
        "type":"cat",
        "breed":"birman",
        "classification":"mammal",
        "sprite":"feline"
     }

]}

我使用在单独文件中创建的结构调用 JSON 数据

动物.swift

struct animalStruct {
    static let path = NSBundle.mainBundle().pathForResource("animal", ofType: "JSON")

    static let jsonData = NSData(contentsOfFile:path!, options: .DataReadingMappedIfSafe, error: nil)

    static var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonData!, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
}

并使用以下代码将其调用到 TableView Controller 中

AnimalTableViewController

var array : NSArray = Animal.animalStruct.jsonResult["animal"] as NSArray

用于搜索的代码:

AnimalTableViewController

    @IBOutlet var segmentedSortOption: UISegmentedControl!
    var array : NSArray = Animal.pokemonStruct.jsonResult["animal"] as NSArray
    var filteredAnimal = [String]()
    var resultSearchController = UISearchController()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.resultSearchController = ({
            let controller = UISearchController(searchResultsController: nil)
            controller.searchResultsUpdater = self
            controller.dimsBackgroundDuringPresentation = false
            controller.searchBar.sizeToFit()

            self.tableView.tableHeaderView = controller.searchBar

            return controller
        })()
        self.tableView.reloadData()
    }

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

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if tableView == self.searchDisplayController?.searchResultsTableView {
        return self.filteredAnimal.count
        } else {
            return self.array.count
        }
    }

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

        var myCell:cell = self.tableView.dequeueReusableCellWithIdentifier("cell") as cell
        var upperCasedNames = array[indexPath.row]["name"] as? String
        var searchedItem:String

        if segmentedSortOption.selectedSegmentIndex == 0 {
            if (self.resultSearchController.active) {
                //**ISSUE OCCURS HERE**
                myCell.name.text = filteredAnimal[indexPath.row]
                return myCell
            }
            else {
                myCell.name.text = upperCasedNames?.uppercaseString
                return myCell
            }
        } else if segmentedSortOption.selectedSegmentIndex == 1 {

            if let unsortedEvents = Animal.animalStruct.jsonResult["animal"] as? NSArray {
                let descriptor = NSSortDescriptor(key: "name", ascending: true, selector: "caseInsensitiveCompare:")
                let aToZ = unsortedEvents.sortedArrayUsingDescriptors([descriptor])
                upperCasedNames = aToZ[indexPath.row]["name"] as? String
                myCell.name.text = upperCasedNames?.uppercaseString
            }
        }
        return myCell
    }

    func updateSearchResultsForSearchController(searchController: UISearchController)
    {
        filteredAnimal.removeAll(keepCapacity: false)
        let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text)
        let arrays = (array).filteredArrayUsingPredicate(searchPredicate!)
        filteredArray = arrays as [[String]]
        self.tableView.reloadData()
    }
}

我的问题

我遇到的问题是,当我尝试通过 UISearchBar 进行搜索时,在单击它的那一刻,我收到“ fatal error :数组无法从 Objective-C 桥接”。我相信这种情况正在发生,因为与我使用的数组相比,教程中使用的数组是不同的类型。

更新

首先,主要问题是,与教程相比,我有不同类型的数组;所以我改变了 var filteredAnimal = [String]()var filteredArray = [[String:AnyObject]]()因为数据源/JSON 文件有大量数据数组。并将其视为 AnyObject,这样我就可以从 JSON 文件中调用特定信息。

之所以返回空数组,是因为我没有在updateSearchResultsController内的空数组中分配搜索到的值。方法,因此我在重新加载表数据之前添加了以下内容 - filteredArray = arrays as [[String:AnyObject]]

这仍然没有解决问题,因为我必须更改 numberOfRowsInSection 中的 if 语句来自tableView == self.searchDisplayController?.searchResultsTableViewself.resultSearchController.active ,然后它为我检索了实际结果。

然而,搜索本身仍然无法正常工作,但大多数问题已经解决。当点击搜索栏时,它只检索数组的最终索引,当搜索任何内容时,它会删除该值。我将继续努力,希望尽快解决这个问题。感谢您迄今为止的帮助!

最佳答案

以下链接可能会帮助您解决问题:

How can I fix "fatal error: can't index empty buffer"

in your code

 let arrays = (array).filteredArrayUsingPredicate(searchPredicate!)

will create new reference of arrays.

关于ios - UISearchBar搜索功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32610722/

相关文章:

ios - UIApplication sharedApplication 在返回应用程序并重新启动时继续执行

iphone - AudioQueue读取输入音量

iphone - 如何减少/删除分组的 UITableView 中的左/右边距?

ios - 如何在 iPhone 应用程序中实现本地缓存 Web 服务数据检索?

ios - 在 Swift 中向通知添加 if 语句

ios - MailCore2 替代品

ios - 将 UIPageViewController 添加到框架小于整个 View Controller 的现有 View Controller 中

ios - 如何在 ios 7 中更改 UILocalizedIndexedCollat​​ion 的背景颜色

ios - 如何使用 RxSwift 在 1 行中显示 3 列 Collection View

swift - 调用以 TypeAlias 作为参数的函数?