Ios UITableView过滤
我必须使用搜索栏在tableview中执行搜索操作。Ios UITableView过滤,ios,swift,iphone,uitableview,Ios,Swift,Iphone,Uitableview,我必须使用搜索栏在tableview中执行搜索操作。 在牢房里有一个人名字的标签和这些人的形象 我的代码是 override func viewDidLoad() { super.viewDidLoad() ArrPersons = ["Mahatma Gandhi","Pramukh Swami","Akshay Kumar","Sachin Tendulkar","Chetan Bhagat","Sardar Vallabhai Patel","Amitabh Ba
在牢房里有一个人名字的标签和这些人的形象 我的代码是
override func viewDidLoad() {
super.viewDidLoad()
ArrPersons = ["Mahatma Gandhi","Pramukh Swami","Akshay Kumar","Sachin Tendulkar","Chetan Bhagat","Sardar Vallabhai Patel","Amitabh Bachchan"]
arrPersonImages = ["1.png","2.png","3.png","4.png","5.png","6.png","7.png"]
}
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
if (searchText.characters.count>0) {
let predicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchText)
ArrPersons = arrTemp
let array = (self.ArrPersons as NSArray).filteredArrayUsingPredicate(predicate)
print(array)
ArrPersons = array as! [String]
}
else
{
ArrPersons = arrTemp
}
self.tableviewww.reloadData()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return self.ArrPersons.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
let cell = tableviewww.dequeueReusableCellWithIdentifier("mycell")as! buildVcCell
cell.personsImages.image = UIImage (named:arrPersonImages[indexPath.row] )
cell.labelPersonNamess?.text = self.ArrPersons[indexPath.row]
cell.addBtn.addTarget(self, action: #selector(BuildVc.AddbuttonClicked(_:)), forControlEvents: .TouchUpInside)
return cell
}
问题是这段代码只对标签人员数组执行搜索
arrPersonImages
不会根据在搜索栏中输入的人的姓名进行过滤。进行搜索的最佳方法是使用具有字典属性的数组来保留搜索结果。仅供参考:
class PersonController: UITableViewController {
let ArrPersons = [["name": "Mahatma Gandhi", "image": "1.png"], ["name": "Akshay Kumar", "image": "2.png"]]
var searchResult: [[String: String]]!
override func viewDidLoad() {
super.viewDidLoad()
searchResult = ArrPersons
}
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
if (searchText.characters.count>0) {
searchResult = arr.filter { (item) -> Bool in
let name = item["name"]
return name!.containsString(searchText)
}
}
else
{
searchResult = ArrPersons
}
self.tableView.reloadData()
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return self.searchResult.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
let cell = tableView.dequeueReusableCellWithIdentifier("mycell")as! buildVcCell
let person = searchResult[indexPath.row]
cell.personsImages.image = UIImage(named: person["image"]) // Person image
cell.labelPersonNamess?.text = person["name"] // Person name
cell.addBtn.addTarget(self, action: #selector(BuildVc.AddbuttonClicked(_:)), forControlEvents: .TouchUpInside)
return cell
}
}
执行搜索的最佳方法是使用具有字典属性的数组来保留搜索结果。仅供参考:
class PersonController: UITableViewController {
let ArrPersons = [["name": "Mahatma Gandhi", "image": "1.png"], ["name": "Akshay Kumar", "image": "2.png"]]
var searchResult: [[String: String]]!
override func viewDidLoad() {
super.viewDidLoad()
searchResult = ArrPersons
}
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
if (searchText.characters.count>0) {
searchResult = arr.filter { (item) -> Bool in
let name = item["name"]
return name!.containsString(searchText)
}
}
else
{
searchResult = ArrPersons
}
self.tableView.reloadData()
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return self.searchResult.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
let cell = tableView.dequeueReusableCellWithIdentifier("mycell")as! buildVcCell
let person = searchResult[indexPath.row]
cell.personsImages.image = UIImage(named: person["image"]) // Person image
cell.labelPersonNamess?.text = person["name"] // Person name
cell.addBtn.addTarget(self, action: #selector(BuildVc.AddbuttonClicked(_:)), forControlEvents: .TouchUpInside)
return cell
}
}
我认为将每个角色的名称和图像组合到一个模型结构中是很有意义的,而是将其用作单元格的基础。也就是说,下面的内容应该可以在不太修改现有代码的情况下帮助您。它还将避免实际更改阵列 这是一个很好的动态变量,可以让其他地方的事情更加自动化:
var filteredPersons: [String] {
return arrPersons.filter{ $0.contains(searchString) }
}
这会给你
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return filteredPersons.count
}
然后,在CellForRowatineXpath函数中,可以创建如下名称和图像:
let name = filteredPersons[indexPath.row]
let imageIndex = arrPersons.index(of: name)
let image = UIImage(named: arrPersonImages[imageIndex])
我认为将每个角色的名称和图像组合到一个模型结构中是很有意义的,而是将其用作单元格的基础。也就是说,下面的内容应该可以在不太修改现有代码的情况下帮助您。它还将避免实际更改阵列 这是一个很好的动态变量,可以让其他地方的事情更加自动化:
var filteredPersons: [String] {
return arrPersons.filter{ $0.contains(searchString) }
}
这会给你
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return filteredPersons.count
}
然后,在CellForRowatineXpath函数中,可以创建如下名称和图像:
let name = filteredPersons[indexPath.row]
let imageIndex = arrPersons.index(of: name)
let image = UIImage(named: arrPersonImages[imageIndex])
您应该为此人创建一个“模型”(使用模式):
首先,创建“人”模型:
您可以创建一个人物模型数组,而不是使用两个单独的数组来存储人物数据:
struct Person {
var name: String?
var imageName: String?
}
// add those vars to your ViewController:
var persons = [Person]()
var filteredPersons = [Person]()
var isFiltering = false
override func viewDidLoad() {
super.viewDidLoad()
persons = [Person(name: "Ahmad", imageName: "img.png"), Person(name: "Harry", imageName: "img.png")]
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if (searchText.characters.count>0) {
isFiltering = true
filteredPersons = persons.filter {
$0.name?.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil
}
print(filteredPersons)
}
else
{
isFiltering = false
filteredPersons = persons
}
self.tableviewww.reloadData()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return isFiltering == true ? filteredPersons.count : persons.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//...
// getting the current person
let currentPerson = isFiltering == true ? filteredPersons[indexPath.row] : persons[indexPath.row]
// do the rest of the implementation...
//...
}
注意这是Swift 3代码。您应该为此人创建一个“模型”(使用模式):
首先,创建“人”模型:
您可以创建一个人物模型数组,而不是使用两个单独的数组来存储人物数据:
struct Person {
var name: String?
var imageName: String?
}
// add those vars to your ViewController:
var persons = [Person]()
var filteredPersons = [Person]()
var isFiltering = false
override func viewDidLoad() {
super.viewDidLoad()
persons = [Person(name: "Ahmad", imageName: "img.png"), Person(name: "Harry", imageName: "img.png")]
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if (searchText.characters.count>0) {
isFiltering = true
filteredPersons = persons.filter {
$0.name?.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil
}
print(filteredPersons)
}
else
{
isFiltering = false
filteredPersons = persons
}
self.tableviewww.reloadData()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return isFiltering == true ? filteredPersons.count : persons.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//...
// getting the current person
let currentPerson = isFiltering == true ? filteredPersons[indexPath.row] : persons[indexPath.row]
// do the rest of the implementation...
//...
}
请注意这是Swift 3代码。您没有对搜索文本DIDCHANGE功能中的
arrPersonImages
执行筛选,因此所有图像仍然存在。我想你最好创建一个字典来保存人名和图片,比如[[name:“Michael”,image:“1.png”],[name:“Peter”,image:“2.png”],…]
,然后你只需要为你的建议过滤一次arraythankyu@Enix..我试图像这样更改我的代码,但它不起作用..func searchBar(searchBar:UISearchBar,textDidChange searchText:String){if(searchText.characters.count>0){let predicate=NSPredicate(格式:“SELF CONTAINS[c]@”,searchText)arrayPersonnimages=arrTemp let array=(SELF.arrayPersonnimages作为NSMutableArray)。filterDarrayusingPredicate(谓词)打印(数组)ArrayPersonsNimages=ArrayAsAnyObject为!NSMutableArray}其他{ArrayPersonsNimages=arrTemp}self.tableVieww.reloadData()您无法使用先前定义的谓词
筛选ArrayPersonNimages数组,因为您的谓词是通过筛选人名定义的。您的图像名不包含任何人名,对吗?您没有在search textdidchange函数中对arrPersonImages
执行筛选,因此所有图像仍然存在。I think您最好创建一个字典来保存人名和图像,比如[[name:“Michael”,image:“1.png”],[name:“Peter”,image:“2.png”],…]
,然后您只需为该数组过滤一次Ankyou@Enix以获得您的建议..我试图像这样更改代码,但不起作用..func searchBar(searchBar:UISearchBar,textDidChange searchText:String){if(searchText.characters.count>0){let predicate=NSPredicate(格式:“SELF CONTAINS[c]@”,searchText)arrayPersonnimages=arrTemp let array=(SELF.arrayPersonnimages作为NSMutableArray)。filterDarrayusingPredicate(谓词)打印(数组)ArrayPersonsNimages=ArrayAsAnyObject为!NSMutableArray}其他{ArrayPersonsNimages=arrTemp}self.tableVieww.reloadData()您无法使用先前定义的谓词
筛选ArrayPersonNimages数组,因为您的谓词是通过筛选人名定义的。您的图像名不包含任何人名,对吗?非常感谢..它确实帮助了我,现在起作用了!:)我有一个数组,其中包含以下元素的字典-({images=“1.png”names=“圣雄甘地”},{images=“2.png”names=“Pramukh Swami”},{images=“4.png”names=“Sachin Tendulkar”})可以对它执行相同的搜索操作吗?当然可以。但请记住更改为在代码中引用它的字典的关键字名称。例如,person[“images”]
,person[“names”]
,item[“names”]
非常感谢。它真的帮助了我,现在开始工作了!:)我有一个数组,其中包含如下元素的字典——({images=“1.png”names=“Mahatma Gandhi”;},{images=“2.png”;names=“Pramukh Swami”;},{images=“4.png”;names=“Sachin Tendulkar”;})可以对它执行相同的搜索操作吗?当然可以。但请记住更改为在代码中引用它的字典的关键字名称。例如,person[“images”]
,person[“names”]
,item[“names”]
谢谢@T.Benjamin Larsen!!您的