当我使用以下配置搜索时,我可以获得结果,但有几个问题:
- 当我搜索一个人时,我可以使用打印命令在底部的输出区域中看到结果,但它不会显示在屏幕上。如果我删除一个单词,它会显示结果!例如,如果我输入 Michael,则不会显示任何结果,但如果我删除 Michael 单词末尾的字母 L,则会正确显示结果。
- 有时搜索栏会充当第一响应者,有时则不会。我需要点击搜索两次。
- 如果我在搜索词后输入空格,应用程序会崩溃并出现“ fatal error :数组索引超出范围”错误。
我的代码如下:
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if shouldShowSearchResults {
return filteredArray.count
}
else {
return homesearchResults.count
}
}
func updateSearchResultsForSearchController(searchController: UISearchController) {
filteredTableData.removeAll(keepCapacity: false)
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
if searchController.searchBar.text?.characters.count > 2
{
goSearch(searchController.searchBar.text!)
}
let array = (homesearchResults as NSArray).filteredArrayUsingPredicate(searchPredicate)
filteredArray = array as! [String]
self.homeTableView.reloadData() }
func configureSearchController() {
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.placeholder = "Search"
searchController.searchBar.delegate = self
searchController.searchBar.sizeToFit()
let textFieldInsideSearchBar = searchController.searchBar.valueForKey("searchField") as! UITextField
textFieldInsideSearchBar.font = UIFont(name: "Bauhaus", size: 19)
searchController.searchBar.setImage(UIImage(named: "searchicon"), forSearchBarIcon: UISearchBarIcon.Search, state: UIControlState.Normal);
homeTableView.tableHeaderView = searchController.searchBar}
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
searchController.searchBar.becomeFirstResponder()}
func searchBarShouldBeginEditing(searchBar: UISearchBar) -> Bool {
print ("searchBarSearchButton Clicked")
return true
}
func goSearch(searchWord: String)
{
homeSearchBar.resignFirstResponder()
let myUrl = NSURL(string: "http://bla.net/home.php")
let request = NSMutableURLRequest(URL:myUrl!);
request.HTTPMethod = "POST";
let defaults = NSUserDefaults.standardUserDefaults()
let user_id = defaults.integerForKey("dbID") as Int
let postString = "searchWord=\(searchWord)&userId=\(user_id)";
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding);
let task = NSURLSession.sharedSession().dataTaskWithRequest(request){
data, response, error in
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary
self.homesearchResults.removeAll(keepCapacity: false)
self.homeimageResults.removeAll(keepCapacity: false)
self.homeidResults.removeAll(keepCapacity: false)
self.homeTableView.reloadData()
if let parseJSON = json {
print(parseJSON)
if let friends = parseJSON["friends"] as? [AnyObject]
{
for friendObj in friends
{
let fullName = (friendObj["name"] as! AnyObject)
self.homesearchResults.append(fullName as! String)
let friendRequestImage = (friendObj["thumb"] as! AnyObject)
self.homeimageResults.append(friendRequestImage as! String)
let NotID = (friendObj["id"] as! AnyObject)
self.homeidResults.append(NotID as! String)
}
self.homeTableView.reloadData()
} else if(parseJSON["message"] != nil)
{
let errorMessage = parseJSON["message"] as? String
if(errorMessage != nil)
{
self.displayAlertMessage(errorMessage!)
}
}
}}
catch {
print("json error: \(error)")
}
}
task.resume()
}
最佳答案
我相信您需要将 do/catch 语句包装在dispatch_async 调用中(在您的 doSearch 方法中):
dispatch_async(dispatch_get_main_queue(), { () -> Void in
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!,
....
})
关于ios - 使用 UISearchController 无法正确运行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35107851/