当搜索栏为空或无时,表格为空
问题描述:
当我搜索商店时,表格会得到正确的商店。但是当我编辑我的搜索词(例如删除一个字母)时,表格变为空白。即使我删除搜索词,表格也变空了!我必须去一个不同的视图控制器,并返回到搜索栏查看完整的表格。当搜索栏为空或无时,表格为空
这是我的代码
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
回原来的表格单元格。或者当再次搜索时,我希望它执行另一个搜索。
我的商店阵列是不是一个字符串类型它是内有串类类型。因为它是从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()
}
}
答
在夫特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
可以请你检查我更新的问题,以查看错误与我的商店阵列 – leo0019
没问题,只是声明附配的VAR附配:[商铺]!并使用您使用的过滤器表单。 –
问题在于'文本'在'let temp:NSString = text作为NSString' – leo0019