在 Swift 中智能搜索解析用户名不起作用

2024-01-02

我试图在我的 iOS 应用程序中进行智能搜索,以便当用户在 UISearchBar 中键入字符时,结果会自动在搜索栏下方的表格视图中更新。由于某种原因,当我在搜索栏中输入字符时,不会调用带有 textDidChange 的 searchBar 函数。输入 2 个字符后调用它。因此,我的搜索结果总是比搜索栏中实际输入的内容慢 1 步。而且 search() 函数似乎每次都会被调用两次。有任何想法吗?

//FUNC: search
func search(searchText: String? = nil){

        if searchText == nil || searchText == "" {
            println("No users found.")

        } else {

            var query = PFUser.query()

            //MAKE CASE INSENSTIVE
            query!.whereKey("username", containsString: searchText!)

            query!.findObjectsInBackgroundWithBlock { (results, error) -> Void in

                if error != nil {
                    println(error)
                } else {
                    if let res = results {
                        self.data = res as? [PFUser]
                    }
                }
            }
        }
        self.tableView.reloadData()

}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
    let user = data[indexPath.row] as! PFUser
    let username = user.username
    println(username)
    cell.textLabel?.text = username
    return cell

}


func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    search(searchText: searchText)
    searchActive = false;

}

您将需要实现 UISearchResultsUpdating 协议来实现此目的。它使用 UISearchController(在 iOS 8 中引入),必须以编程方式添加,而不是通过故事板添加,但不用担心,它非常简单。

这应该可以帮你完成工作

干杯, 拉塞尔

class YourTableViewController: UITableViewController, UISearchBarDelegate, UISearchResultsUpdating {
    var searchUsers: [PFUser] = [PFUser]()
    var userSearchController = UISearchController()
    var searchActive: Bool = false

    // MARK: - Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()

        self.userSearchController = UISearchController(searchResultsController: nil)
        self.userSearchController.dimsBackgroundDuringPresentation = true

        // This is used for dynamic search results updating while the user types
        // Requires UISearchResultsUpdating delegate
        self.userSearchController.searchResultsUpdater = self

        // Configure the search controller's search bar
        self.userSearchController.searchBar.placeholder = "Search for a user"
        self.userSearchController.searchBar.sizeToFit()
        self.userSearchController.searchBar.delegate = self
        self.definesPresentationContext = true

        // Set the search controller to the header of the table
        self.tableView.tableHeaderView = self.userSearchController.searchBar
    }

    // MARK: - Parse Backend methods

    func loadSearchUsers(searchString: String) {
        var query = PFUser.query()

        // Filter by search string
        query.whereKey("username", containsString: searchString)

        self.searchActive = true
        query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]?, error: NSError?) -> Void in

            if (error == nil) {
                self.searchUsers.removeAll(keepCapacity: false)
                self.searchUsers += objects as! [PFUser]
                self.tableView.reloadData()
            } else {
                // Log details of the failure
                println("search query error: \(error) \(error!.userInfo!)")
            }
            self.searchActive = false
        }
    }

    // MARK: - Search Bar Delegate Methods

    func searchBarSearchButtonClicked(searchBar: UISearchBar) {

        // Force search if user pushes button
        let searchString: String = searchBar.text.lowercaseString
        if (searchString != "") {
            loadSearchUsers(searchString)
        }
    }

    func searchBarCancelButtonClicked(searchBar: UISearchBar) {

        // Clear any search criteria
        searchBar.text = ""

        // Force reload of table data from normal data source
    }

    // MARK: - UISearchResultsUpdating Methods

    // This function is used along with UISearchResultsUpdating for dynamic search results processing
    // Called anytime the search bar text is changed
    func updateSearchResultsForSearchController(searchController: UISearchController) {

        let searchString: String = searchController.searchBar.text.lowercaseString
        if (searchString != "" && !self.searchActive) {
            loadSearchUsers(searchString)
        }
    }

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if (self.userSearchController.active) {
            return self.searchUsers.count
        } else {
            // return whatever your normal data source is
        }
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier("userCell") as! UserCell

        if (self.userSearchController.active && self.searchUsers.count > indexPath.row) {
            // bind data to the search results cell
        } else {
            // bind data from your normal data source
        }

        return cell
    }

    // MARK: - UITableViewDelegate

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        tableView.deselectRowAtIndexPath(indexPath, animated: true)

        if (self.userSearchController.active && self.searchUsers.count > 0) {
            // Segue or whatever you want
        } else {
            // normal data source selection
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swift 中智能搜索解析用户名不起作用 的相关文章

随机推荐

  • Groovy:“def x = 0”中“def”的用途是什么?

    在下面的代码中 摘自Groovy 语义手册页 http groovy lang org semantics html while loop 为什么要在赋值前加上关键字def def x 0 def y 5 while y gt 0 prin
  • 一条消息可以有多个发件人吗?

    当我想检查谁使用 JavaMail 向我发送了特定电子邮件时 我可以用 Message getFrom 它返回一个 Message 在什么情况下 一条复活的消息可以有多个来自它的身份 关于API https javamail java ne
  • 如何在 vue nuxt ts 中对特定 div 使用滚动事件监听器

    我知道 nuxt js 很有可能做到这一点 但是我们如何使用 nuxt 和丑陋的 ts 来做到这一点呢 如果有人能够做到这一点 请将此代码转换为 script lang ts 的条款 对于 nuxt 来说 在监听特定 div 附加示例的滚动
  • MySQL InnoDB 因等待表级锁而挂起

    我有一个大型生产网络应用程序 Glassfish 3 1 MySQL 5 5 所有表都是InnoDB 每隔几天应用程序就会完全挂起 SHOW FULL PROCESSLIST显示不同表上的许多简单插入或更新查询 但都有状态 等待表级锁 例子
  • 从 JSP 列表填充 JavaScript 数组

    好吧 也许有人可以帮助我解决我正在尝试解决的问题 本质上 我有一个 JSP 页面 它获取 Country 对象的列表 来自 Spring Portlet SimpleFormController 的方法 referenceData 不完全相
  • Spark 中的任务是什么? Spark Worker如何执行jar文件?

    阅读了一些文档后http spark apache org docs 0 8 0 cluster overview html http spark apache org docs 0 8 0 cluster overview html 我有
  • Spring 5 LDAP 身份验证和 JWT 令牌作为响应

    你好 我一直在尝试配置 spring 让它在用户 通行证通过 LDAP 服务器身份验证时返回 JWT 令牌 考虑下面的用例 在上图中 我已将 WebSecurity 配置为使用 Bearer 检查 过滤请求 请参阅下面的代码 WebSecu
  • 如何因数据绑定的 safeUnbox 警告而导致构建过程失败

    这个问题 https stackoverflow com questions 42872201 data binding safeunbox warning解释什么是 safeUnbox 警告 我的 build gradle 中有以下内容
  • 如何检测触摸事件是否已落在 EditText 内?

    我可以找到 getX 和 getY 都返回一个浮点数 但是如何检测 TouchEvent e get e getY 的坐标是否在 EditText UI 元素的边界内 我注意到 getX 和 getY 是浮点数 但 getHeight 和
  • 使用 Jquery Ajax 和 PHP 的 Google 隐形 Recaptcha

    试图让我的表单使用谷歌隐形验证码与我的 jQuery AJAX 和 PHP 一起正常工作 根据我的研究 令牌似乎没有通过 AJAX 正确发送到我的 PHP 页面 提交表单时 我的 PHP 页面不断收到以下错误 array 2 success
  • nginx 上的 Zend 框架

    我一直在开发的基于 Zend Framework 的站点现在正在迁移到其生产服务器 该服务器原来是 nginx 惊讶 当然 该站点无法正常工作 因为它是在 Apache 上开发的并且依赖于 htaccess 文件 我的问题是 有人有这方面的
  • Android Gallery 的 getView() 返回不正确的位置

    谢谢阅读 我使用 Android Gallery 并将两个 LayoutParams 都设置为 MATCH PARENT 来一次显示一张全屏图像 这是我的代码 布局 xml
  • 从 CSV 文件的字符串列中删除新行

    我有一个包含多个字段的 CSV 文件 很少有字段 字符串 的数据跨越多行 我想将这些多行聚合成一行 输入数据 1 asdsdsdsds John 2 dfdhifdkinf dfjdfgkdnjgknkdjgndkng dkfdkjfnjd
  • 如何修复 Bower ECMDERR

    我在 Windows 7 上使用 yeoman 和 bower 但在创建应用程序时出现以下错误 yo webapp 错误是 bower not cached git github com jlong sass bootstrap git 3
  • 正则表达式删除一个空格

    删除一个空格的正则表达式是什么 例如 H e l l o W o r l d gt Hello World 请注意 Hello World 之间仍然有一个空格 一开始它之间就有两个空格 仅供参考 我正在使用 C 正则表达式 以前我做过类似的
  • UILabel视图在高度大于8192时消失

    将大字符串分配给 UILabel 并且 将此标签添加到滚动视图中 当 UILabel 高度大于 8192pt 即 2 13 时 UILabel 消失 这是 iOS 的错误吗 我应该使用其他实现来渲染如此数量的字符串吗 我应该将表格视图与单元
  • 使用ActiveRecord实现Rails中的复杂关系

    From 另一个问题 https stackoverflow com questions 27342419 generate a rails model from within code invoke generator from a co
  • C 中的 MIN 和 MAX

    在哪MIN and MAX如果有的话 是在 C 中定义的吗 实现这些的最佳方法是什么 尽可能通用并安全地输入 首选主流编译器的编译器扩展 内置函数 在哪MIN and MAX如果有的话 是在 C 中定义的吗 他们不是 实现这些的最佳方法是什
  • 确定可执行文件(或库)是 32 位还是 64 位(在 Windows 上)

    我试图查明给定的可执行文件 或库 是否是从 Python 编译为 32 位或 64 位的 我正在运行 Vista 64 位 并且想确定目录中的某个应用程序是针对 32 位还是 64 位进行编译 有没有一种简单的方法可以仅使用标准 Pytho
  • 在 Swift 中智能搜索解析用户名不起作用

    我试图在我的 iOS 应用程序中进行智能搜索 以便当用户在 UISearchBar 中键入字符时 结果会自动在搜索栏下方的表格视图中更新 由于某种原因 当我在搜索栏中输入字符时 不会调用带有 textDidChange 的 searchBa