gpt4 book ai didi

ios - UISearchBar搜索功能不起作用

转载 作者:行者123 更新时间:2023-11-30 14:04:14 27 4
gpt4 key购买 nike

我尝试在这个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com