当搜索栏为空或无时,表格为空

问题描述:

当我搜索商店时,表格会得到正确的商店。但是当我编辑我的搜索词(例如删除一个字母)时,表格变为空白。即使我删除搜索词,表格也变空了!我必须去一个不同的视图控制器,并返回到搜索栏查看完整的表格。当搜索栏为空或无时,表格为空

这是我的代码

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 

    shops = shops.filter { $0.shopname.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil} 


    tableView.reloadData() 

} 

我应该在哪里实施if searchBar.text == "" || searchBar.text ==nill回原来的表格单元格。或者当再次搜索时,我希望它执行另一个搜索。

UPDATE enter image description here

我的商店阵列是不是一个字符串类型它是内有串类类型。因为它是从API使用JSON数据的自定义细胞

var shops: [Shops]! 
var isSearch = false 
var auxiliar : [String] = [] 
var searchActive: Bool = false 



class Shops { 
private var _familiy_id: String? 
private var _logo : String? 

private var _shopname : String? 

var familiy_id : String{ 
    return _familiy_id! 
} 

    var shopname : String{ 
    return _shopname! 
} 
var Logo : String{ 
    return _logo! 
} 
init(shopname : String , Logo : String , family_id : String) { 

    self._shopname = shopname 
      self._logo = Logo 
    self._familiy_id = family_id 
} 

}

的问题是在这条线:

shops = shops.filter { ... } 

如你仅施加在过滤器和原始阵列重叠,那么您会失去这些元素。需要一个辅助数组来帮助保留原始数据。

一个简单的例子:(代码更新)

import UIKit 

class Shops { 
    private var _familiy_id: String? 
    private var _logo : String? 
    private var _shopname : String? 

    var familiy_id : String{ 
     return _familiy_id! 
    } 

    var shopname : String{ 
     return _shopname! 
    } 
    var Logo : String{ 
     return _logo! 
    } 
    init(shopname : String , Logo : String , family_id : String) { 
     self._shopname = shopname 
     self._logo = Logo 
     self._familiy_id = family_id 
    } 
} 



class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate { 
    @IBOutlet weak var tableView: UITableView! 
    @IBOutlet weak var searchBar: UISearchBar! 

    var shops : [Shops]! = [] 
    var auxiliar : [Shops]! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // 1 - load data to shops array 
     shops.append(Shops(shopname: "Brasil", Logo: "BR", family_id: "1")) 
     shops.append(Shops(shopname: "Brasolia", Logo: "BA", family_id: "2")) 
     shops.append(Shops(shopname: "Colombia", Logo: "CO", family_id: "3")) 
     shops.append(Shops(shopname: "Argentina", Logo: "AR", family_id: "4")) 




     // 2 - auxiliar receive the complete original array 
     auxiliar = shops 

     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return auxiliar.count; 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! 
     cell.textLabel?.text = auxiliar[indexPath.row].shopname 
     return cell 
    } 

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 
     auxiliar = shops.filter { $0.shopname.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil } 
     if searchText == "" { 
      // 3 if there is nothing to search, auxiliar receive the complete orihinal array 
      auxiliar = shops 
     } 

     tableView.reloadData() 
    } 
} 
+0

可以请你检查我更新的问题,以查看错误与我的商店阵列 – leo0019

+0

没问题,只是声明附配的VAR附配:[商铺]!并使用您使用的过滤器表单。 –

+0

问题在于'文本'在'let temp:NSString = text作为NSString' – leo0019

夫特3可以使用这样的代码。你只是尝试这个代码。

import UIKit 

class SearchBarTableView: UIViewController, UITableViewDataSource,UITableViewDelegate, UISearchBarDelegate { 

    @IBOutlet weak var tableView: UITableView! 
    @IBOutlet weak var searchBar: UISearchBar! 

    var shops : [String] = ["Brasil", "Argentina", "Colombia", "Chile", "Equador", "Peru", "Uruguai", "Paraguai", "Venezuela"]; 
    var auxiliar : [String] = [] 
    var searchActive: Bool = false 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     self.tableView.dataSource = self 
     self.tableView.delegate = self 
     self.searchBar.delegate = self 
    } 

    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) 
    { 
     self.searchActive = true 
    } 

    func searchBarTextDidEndEditing(_ searchBar: UISearchBar) 
    { 
     self.searchActive = false 
    } 

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) 
    { 
     self.searchActive = false 
    } 

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) 
    { 
     self.searchActive = false 
    } 

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 
    { 
     self.auxiliar = self.shops.filter({ (text) -> Bool in 
     let temp: NSString = text as NSString 
     let range = temp.range(of: searchText, options:.caseInsensitive) 
    return range.location != NSNotFound 
    }) 

     if self.auxiliar.count == 0 
     { 
      searchActive = false 
     } 
     else 
     { 
      searchActive = true 
     } 
     self.tableView.reloadData() 
    } 


    func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if searchActive 
     { 
     return auxiliar.count 
     } 
     return shops.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! 
     if searchActive 
     { 
      cell.textLabel?.text = auxiliar[indexPath.row] 
     } 
     else 
     { 
      cell.textLabel?.text = shops[indexPath.row] 
     } 
     return cell 
    } 
+0

感谢您的回答。你可以看看我更新的问题,看看我得到的错误,因为我的'商店'数组类型 – leo0019