У меня есть контроллер табличного представления, который захватывает json-данные с веб-сайта и отображает значения каждой записи в виде строки. TVC имеет делегат панели поиска, который позволяет вам искать записи по имени. Все работает нормально, за исключением случаев, когда вы нажимаете на фильтруемую запись (то есть вы вводите значение поиска в строке поиска и щелкаете по отфильтрованному списку), это приводит к неправильной записи. Я не уверен, что я делаю неправильно, но любая помощь оценилаБыстрый поиск строки поиска
import UIKit
class SearchTableViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate {
@IBOutlet weak var searchBar: UISearchBar!
var searchActive : Bool = false
var filtered:[String] = []
var filteredURLs:[String] = []
var filteredName:[String] = []
var TableData2:Array<String> = Array <String>()
var TableData2URLs:Array<String> = Array <String>()
var TableDataName:Array<String> = Array <String>()
var passedValue:String!
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Search"
get_data_from_url(passedValue)
/* Setup delegates */
tableView.delegate = self
tableView.dataSource = self
searchBar.delegate = self
}
// functions added for search bar
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
searchActive = true;
}
func searchBarTextDidEndEditing(searchBar: UISearchBar) {
searchActive = false;
}
func searchBarCancelButtonClicked(searchBar: UISearchBar) {
searchActive = false;
}
func searchBarSearchButtonClicked(searchBar: UISearchBar) {
searchActive = false;
}
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
filtered = TableData2.filter({ (text) -> Bool in
let tmp: NSString = text
let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
return range.location != NSNotFound
})
filteredURLs = TableData2URLs.filter({ (text) -> Bool in
let tmp: NSString = text
let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
return range.location != NSNotFound
})
filteredName = TableDataName.filter({ (text) -> Bool in
let tmp: NSString = text
let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
return range.location != NSNotFound
})
if(filtered.count == 0){
searchActive = false;
} else {
searchActive = true;
}
self.tableView.reloadData()
}
// End search bar code
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if(searchActive) {
return filtered.count
} else {
return TableData2.count
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
if(searchActive){
cell.textLabel?.text = filtered[indexPath.row]
} else {
cell.textLabel?.text = TableData2[indexPath.row]
}
return cell
}
func get_data_from_url(url:String)
{
let httpMethod = "GET"
let timeout = 15
let url = NSURL(string: url)
let urlRequest = NSMutableURLRequest(URL: url!, cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 15.0)
let queue = NSOperationQueue()
NSURLConnection.sendAsynchronousRequest(
urlRequest,
queue: queue,
completionHandler: {(response: NSURLResponse!,
data: NSData!,
error: NSError!) in
if data.length > 0 && error == nil{
let json = NSString(data: data, encoding: NSASCIIStringEncoding)
self.extract_json(json!)
}else if data.length == 0 && error == nil{
println("Nothing was downloaded")
} else if error != nil{
println("Error happened = \(error)")
}
}
)
}
func extract_json(data:NSString)
{
var parseError: NSError?
let jsonData:NSData = data.dataUsingEncoding(NSASCIIStringEncoding)!
let json: AnyObject? = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &parseError)
if (parseError == nil)
{
if let countries_list = json as? NSArray
{
for (var i = 0; i < countries_list.count ; i++)
{
if let country_obj = countries_list[i] as? NSDictionary
{
if let country_name = country_obj["country"] as? String
{
if let country_code = country_obj["region"] as? String
{
if let namevalue = country_obj["name"] as? String {
TableData2.append(namevalue + ": " + country_name)
TableData2URLs.append("http://www.example.com/jsondetail.php?value=" + namevalue)
TableDataName.append(namevalue)
}
}
}
}
}
}
}
do_table_refresh();
}
func do_table_refresh()
{
dispatch_async(dispatch_get_main_queue(), {
self.tableView.reloadData()
return
})
}
// Pass url details for Segue
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showDetail" {
let detailViewController = segue.destinationViewController as! DetailViewController
let myIndexPath = self.tableView.indexPathForSelectedRow()
let row = myIndexPath?.row
if(searchActive && row < filteredURLs.count){
detailViewController.webSite = filteredURLs[row!]
detailViewController.name = filteredName[row!]
detailViewController.title = filteredName[row!]
println("Filtered URL: " + filteredURLs[row!])
println(row)
println("Filtered Name: " + filteredName[row!])
println(row)
} else {
detailViewController.webSite = TableData2URLs[row!]
detailViewController.name = TableDataName[row!]
detailViewController.title = TableDataName[row!]
println("Table URL: " + TableData2URLs[row!])
println(row)
}
}
}
}
Проблема заключается в том, когда и где вы устанавливаете searchActive = false. Попробуйте установить только значение false (помимо инициализации), когда searchText.count == 0 – Caleb