草庐IT

ios - UISearchController 过滤器 Swift

coder 2023-09-13 原文

我有一个包含 3 个 subview 的 UITableViewCell,我想在搜索时过滤它们,如下所示:

1. ImageView 2.名称标签(黑色文字) 3.街道名称标签(蓝色文字)

这是我到目前为止所做的,我只设法了解如何过滤 1 个数组,即名称:

MainTableView.swift

var FilteredNames = [String]

     func  updateSearchResultsForSearchController(searchController:UISearchController) {

            // Filter Names
            self.filteredNames = self.names.filter { (name:String) -> Bool in
              if name.lowercaseString.containsString(self.searchController.searchBar.text!.lowercaseString){
                    return true
                } else {
                    return false
                }
            }
            self.resultsController.tableView.reloadData()
        }
        override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
            return 100.5
        }
    
        override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

            // Search
            if tableView == self.tableView {
                self.streets.count
               return self.names.count
            } else {
              self.filteredStreets.count
            return self.filteredNames.count
            }               
            // return names.count
            }
        
        override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
           
            let cell = self.tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath: indexPath) as! CustomCell
      
            if tableView == self.tableView {
                cell.photo.image = self.images[indexPath.row]
                cell.name.text = names[indexPath.row]
                cell.streetName.text = streets[indexPath.row]
            } else {
                cell.photo.image = self.images[indexPath.row]
                cell.name.text = self.filteredNames[indexPath.row]
                cell.streetName.text = self.streets[indexPath.row]
            }
            return cell
        }

截至目前,当我搜索时, ImageView 和街道标签与名称不同步。我想过滤所有 3 个 subview 以正确同步。我怎样才能做到这一点?

我知道我需要使用一个结构并用一个对象过滤所有 3 个,但我在设法做到这一点时遇到了一些困难,我们将不胜感激,谢谢!

编辑:这是我现在的代码:

    override func viewDidLoad() {
            super.viewDidLoad()

  var searchController : UISearchController!
    
    var resultsController = UITableViewController()
    
   // //
        definesPresentationContext = true
        self.resultsController.tableView.dataSource = self
        self.resultsController.tableView.delegate = self
        self.searchController = UISearchController(searchResultsController: self.resultsController)
        self.tableView.tableHeaderView = self.searchController.searchBar
        self.searchController.searchResultsUpdater = self
        self.searchController.dimsBackgroundDuringPresentation = true
        self.searchController.searchBar.sizeToFit()
        self.searchController.searchBar.barTintColor = UIColor.blackColor()
        self.searchController.searchBar.endEditing(true)
        self.searchController.searchBar.placeholder = "חפש ברים"
        

    
        allUsers = createUsers(names: names, streets: streets, images: images)
            
            filteredUsers = allUsers
            
            }
        
        var allUsers: [User]!
        var filteredUsers: [User]!
        
        func createUsers(names names: [String], streets: [String], images: [UIImage?]) -> [User] {
            var users = [User]()
            guard names.count == streets.count && names.count == images.count else { return users }
            for (index, name) in names.enumerate() {
                let user = User(name: name, streetName: streets[index], image: images[index])
                users.append(user)
            }
            return users
        }
    
    
    
    
        //MARK : Search !
        func  updateSearchResultsForSearchController(searchController:UISearchController) {
            if let searchText = searchController.searchBar.text?.lowercaseString {
                if searchText.characters.count == 0 {
                    filteredUsers = allUsers
                }
                else {
                    filteredUsers = allUsers.filter {
                        return $0.name.lowercaseString.containsString(searchText) ||
                            $0.streetName.lowercaseString.containsString(searchText)
                    }
                }
            }
            self.resultsController.tableView.reloadData()
        }
        
        override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
        {
            return 100.5;
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            ////////
            
                   ////////
        }
    
        override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return filteredUsers.count
        }
        
        override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
            let cell = self.tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath: indexPath) as! CustomCell
            let user = filteredUsers[indexPath.row]
            cell.photo.image = user.image
            cell.name.text = user.name
            cell.streetName.text = user.streetName
            return cell
        }

最佳答案

我强烈建议只有一个 dataSource 而不是单独的数组用于名称、街道名称和图像。在下面的代码中,filteredUsers 始终用作数据源,而 allUsers 只是一个存储的完整数组,用于在每次新的时更新 filteredUsers在搜索栏中输入文本。

创建模型:

struct User {
    var name: String
    var streetName: String
    var image: UIImage?
}

View Controller :

var allUsers: [User]!
var filteredUsers: [User]!

override func viewDidLoad() {
    super.viewDidLoad()

    //assuming you already have three arrays with the same amount of elements in each:
    allUsers = createUsers(names: names, streets: streets, images: images)

    filteredUsers = allUsers
}

func createUsers(names names: [String], streets: [String], images: [UIImage?]) -> [User] {
    var users = [User]()
    guard names.count == streets.count && names.count == images.count else { return users }
    for (index, name) in names.enumerate() {
        let user = User(name: name, streetName: streets[index], image: images[index])
        users.append(user)
    }
    return users
}

func  updateSearchResultsForSearchController(searchController:UISearchController) {
    if let searchText = searchController.searchBar.text?.lowercaseString {
        if searchText.characters.count == 0 {
            filteredUsers = allUsers
        }
        else {
            filteredUsers = allUsers.filter {
                return $0.name.lowercaseString.containsString(searchText) || 
                       $0.streetName.lowercaseString.containsString(searchText)
            } ?? []
        }            
    }
    self.resultsController.tableView.reloadData()
}


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     return filteredUsers ? filteredUsers.count : 0
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
    let cell = self.tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath: indexPath) as! CustomCell 
    let user = filteredUsers[indexPath.row]
    cell.photo.image = user.image
    cell.name.text = user.name
    cell.streetName.text = user.streetName
    return cell
}

关于ios - UISearchController 过滤器 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40536361/

有关ios - UISearchController 过滤器 Swift的更多相关文章

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  3. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  4. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  5. ruby-on-rails - 在 Controller 中干净地处理多个过滤器(参数) - 2

    我有一个名为Post的类,我需要能够适应以下场景:如果用户选择了一个类别,则只显示该类别的帖子如果用户选择了一种类型,则只显示该类型的帖子如果用户选择了一个类别和类型,则只显示该类别中该类型的帖子如果用户没有选择任何内容,则显示所有帖子我想知道我的Controller是否不可避免地会因大量条件语句而显得粗糙...这是我解决此问题的错误方法-有谁知道我如何才能做到这一点?classPostsController 最佳答案 您最好遵循“胖模型,瘦Controller”的惯例,这意味着您应该将这种逻辑放在模型本身中。Post类应该能够报告

  6. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  7. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  8. ruby-on-rails - Rails 3 - 过滤器链暂停为 :authentication rendered or redirected - 2

    我仍然收到标题中的“错误”消息,但不知道如何解决。在ApplicationController中,classApplicationController在routes.rb#match'set_activity_account/:id/:value'=>'users#account_activity',:as=>:set_activity_account--thisdoesn'tworkaswell..resources:usersdomemberdoget:action_a,:action_bendcollectiondoget'account_activity'endend和User

  9. ruby-on-rails - ActiveAdmin 自定义选择过滤器下拉名称 - 2

    对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking

  10. ruby - 如何通过 belongs_to 按外部 id 和本地属性进行过滤? - 2

    以下模型通过belongs_to链接:require'mongoid'classSensorincludeMongoid::Documentfield:sensor_id,type:Stringvalidates_uniqueness_of:sensor_idend...require'mongoid'require_relative'sensor.rb'classSensorDataincludeMongoid::Documentbelongs_to:sensorfield:date,type:Datefield:ozonMax1h,type:Floatfield:ozonMax8h

随机推荐