【问题标题】:UITableView filteringUITableView 过滤
【发布时间】:2017-02-05 21:40:50
【问题描述】:

我必须使用搜索栏在 tableview 中执行搜索操作。
其中有一个人的姓名标签和这些人在其单元格中的图像。

我的代码是

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

}

问题是这段代码只对标签persons数组执行搜索。 arrPersonImages 没有根据在搜索栏中输入的人的姓名进行过滤。

【问题讨论】:

  • 你没有在搜索textdidchange函数中对arrPersonImages进行过滤,所以所有的图像都还在。我认为您最好创建一个字典来保留人名和图像,例如[[name: "Michael", image: "1.png"], [name: "Peter", image: "2.png"], ...],然后您只需为该数组过滤一次
  • 感谢@Enix 的建议..我试图像这样更改我的代码,但它不起作用..
  • func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { if (searchText.characters.count>0) { let predicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchText ) arrayyPersonsNImages = arrTemp let array = (self.arrayyPersonsNImages as NSMutableArray).filteredArrayUsingPredicate(predicate) print(array) arrayyPersonsNImages = array as AnyObject 一样! NSMutableArray } else { arrayyPersonsNImages = arrTemp } self.tableVieww.reloadData()
  • 您不能使用先前定义的predicate 过滤arrayyPersonsNImages 数组,因为您的谓词是通过过滤人名定义的。您的图像名称不包含任何人名,对吗?

标签: ios swift iphone uitableview


【解决方案1】:

进行搜索的最佳方法是使用具有字典属性的数组来保存搜索结果。仅供参考:

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
    }
}

【讨论】:

  • 非常感谢......它真的帮助了我,现在它的工作! :)
  • 我有一个包含字典的数组,像这样的元素 - ( { images = "1.png"; names = "Mahatma Gandhi"; }, { images = "2.png"; names = " Pramukh Swami"; }, { images = "4.png"; names = "Sachin Tendulkar"; } ) 是否可以对其执行相同的搜索操作?
  • 当然。但请记住更改为您在代码中引用它的字典的键名。例如,person["images"]person["names"]item["names"]
【解决方案2】:

我认为将每个字符的名称和图像组合到一个模型结构中会很有意义,而是将其用作单元格的基础。话虽如此,以下内容应该可以帮助您,而不会过多地更改现有代码。它还会回避实际更改您的数组...

一个很好的动态变量,可以让其他地方的事情更加自动化:

var filteredPersons: [String] {
    return arrPersons.filter{ $0.contains(searchString) }
}

哪个会给你

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

然后在你的 cellForRowAtIndexPath 函数中,你可以像这样创建名称和图像:

let name = filteredPersons[indexPath.row]
let imageIndex = arrPersons.index(of: name)
let image = UIImage(named: arrPersonImages[imageIndex])

【讨论】:

  • 谢谢@T。本杰明拉森!!你的回答对我很有帮助。 :)
【解决方案3】:

您应该为 Person 创建一个“模型”(使用 MVC 模式):

首先,创建“人”模型:

struct Person {
    var name: String?
    var imageName: String?
}

您可以创建一个 Person Model 数组,而不是使用两个单独的数组来存储人员数据:

// 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 代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 2014-05-26
    • 1970-01-01
    • 2023-03-07
    • 2016-08-16
    • 1970-01-01
    相关资源
    最近更新 更多