2015-08-03 2 views
0

У меня есть контроллер табличного представления, который захватывает 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) 

     } 






    } 
} 


} 
+0

Проблема заключается в том, когда и где вы устанавливаете searchActive = false. Попробуйте установить только значение false (помимо инициализации), когда searchText.count == 0 – Caleb

ответ

0

Вы усложнять вещи и не использовать объекты правильно, Вы должны создать объект, который инкапсулирует все данные вам нужно, так что один экземпляр этот класс может хранить все данные, необходимые для каждой ячейки. Таким образом, ваш источник данных представляет собой массив этих объектов, например. [Страна], а другая - для фильтрованных стран. Это формирует модель. Возможно, вы захотите также сохранить эти данные, чтобы вы могли сериализовать объекты. Я начну с этого, а потом посмотрю, как это происходит. Вы разбиваете все на 6 различных массивов, по 3 для каждого набора результатов. Это делает все более сложным.

Что-то, что поможет вам, также является более чистым способом написания, если допустим, например.

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 i in 0..<countries_list.count 
      { 
       if let country_obj = countries_list[i] as? NSDictionary, 
       country_name = country_obj["country"] as? String, 
       country_code = country_obj["region"] as? String, 
       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(); 
} 

Относительно вопроса о выборе. Вы уверены, что все URL-адреса фильтруются правильно?

Смежные вопросы