【问题标题】:Search feature with Parse.com SwiftParse.com Swift 的搜索功能
【发布时间】:2016-04-04 19:01:30
【问题描述】:

我正在尝试搜索我的解析数据库中的所有用户,无论是他们的用户名还是姓名。到目前为止,它正在搜索但不识别第一个字母......它只在输入第二个字母后开始搜索,一旦输入它就会搜索第一个字母......

这是我的问题,如果有人能看到问题,我很乐意得到您的帮助!

更多解释请发表评论...非常感谢。

 func searchBar(searchBar: UISearchBar, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    let usernameQuery = PFQuery(className: "_User")
    usernameQuery.addDescendingOrder("createdAt")
    usernameQuery.limit = 20
    usernameQuery.whereKey("username", matchesRegex: "(?i)" + self.searchBar.text!)
    usernameQuery.findObjectsInBackgroundWithBlock ({ (objects:[PFObject]?, error:NSError?) -> Void in
        if error == nil {
            if objects!.isEmpty {

                let fullnameQuery = PFUser.query()
                fullnameQuery?.whereKey("firstname", matchesRegex: "(?i)" + self.searchBar.text!)
                fullnameQuery?.findObjectsInBackgroundWithBlock({ (objects:[PFObject]?, error:NSError?) -> Void in

                    if error == nil {
                        self.search.removeAll(keepCapacity: false)
                       for object in objects! {

                            let name = SearchStruct(username: object.valueForKey("username") as! String,
                            fullname: object.valueForKey("firstname") as! String,
                            profileImage: object.valueForKey("profilePicture") as! PFFile)
                          self.search.append(name)
                        }
                        self.tableView1.reloadData()

                    }
                })
            }

            self.search.removeAll(keepCapacity: false)

            for object in objects! {
                let user = SearchStruct(username: object.valueForKey("username") as! String,
                fullname: object.valueForKey("firstname") as! String,
                profileImage: object.valueForKey("profilePicture") as! PFFile)

                self.search.append(user)
            }
            self.tableView1.reloadData()
            textLabel.text = ""
            self.activityS.stopAnimating()
        }
    })

编辑

所以我删除了上面的代码并添加了这个:

 func updateSearchResultsForSearchController(searchController: UISearchController) {
       // let searchText = searchController.searchBar.text
        //Here the spinnier is initialized

        activityS.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
        activityS.startAnimating()


        let textLabel = UILabel(frame: CGRect(x: 60, y: 0, width: 300, height: 50))
        textLabel.textColor = UIColor.grayColor()
        textLabel.text = "Searching for \(searchBar.text!)"


        self.view.addSubview(activityS)
        self.view.addSubview(textLabel)


        let usernameQuery = PFQuery(className: "_User")
        usernameQuery.addDescendingOrder("createdAt")
        usernameQuery.limit = 20
        usernameQuery.whereKey("username", matchesRegex: "(?i)" + searchController.searchBar.text!)
        usernameQuery.findObjectsInBackgroundWithBlock ({ (objects:[PFObject]?, error:NSError?) -> Void in
            if error == nil {
                if objects!.isEmpty {

                    let fullnameQuery = PFUser.query()
                    fullnameQuery?.whereKey("firstname", matchesRegex: "(?i)" + searchController.searchBar.text!)
                    fullnameQuery?.findObjectsInBackgroundWithBlock({ (objects:[PFObject]?, error:NSError?) -> Void in

                        if error == nil {
                            self.search.removeAll(keepCapacity: false)
                            for object in objects! {

                                let name = SearchStruct(username: object.valueForKey("username") as! String,
                                    fullname: object.valueForKey("firstname") as! String,
                                    profileImage: object.valueForKey("profilePicture") as! PFFile)
                                self.search.append(name)
                            }
                            self.tableView1.reloadData()

                        }
                    })
                }

                self.search.removeAll(keepCapacity: false)

                for object in objects! {
                    let user = SearchStruct(username: object.valueForKey("username") as! String,
                        fullname: object.valueForKey("firstname") as! String,
                        profileImage: object.valueForKey("profilePicture") as! PFFile)

                    self.search.append(user)
                }
                self.tableView1.reloadData()
                textLabel.text = ""
                self.activityS.stopAnimating()
            }
        })
        // Do your search and refresh the table
        tableView1.reloadData()
    }

【问题讨论】:

  • 我建议下载视图中确实加载的所有对象。然后在用户搜索时过滤它们。
  • 这可能是一些严重的开销,具体取决于他有多少条目......
  • @penatheboss 我认为这不是一个好方法,因为可能会有很多用户......
  • @KevinGoedecke Yeh,这就是我这样做的主要原因
  • 你为什么不使用UISearchResultsUpdating协议的updateSearchResultsForSearchController

标签: swift uitableview parse-platform


【解决方案1】:

尝试使用UISearchResultsUpdating 协议。每次您在搜索栏中输入内容时都会触发updateSearchResultsForSearchController

class YourTableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating, UISearchBarDelegate {

    // Initiate the searchController
    let searchController = UISearchController(searchResultsController: nil)

    override func viewDidLoad() {
        // Use the current view controller to update the search results and as delegate
        self.searchController.searchResultsUpdater = self;
        self.searchController.searchBar.delegate = self;
        self.tableView.tableHeaderView = searchController.searchBar
    }
    ...
    func updateSearchResultsForSearchController(searchController: UISearchController) {
        let searchText = searchController.searchBar.text
        // Do your search and refresh the table
        tableView.reloadData()
    }
    ...
}

希望这会有所帮助。

【讨论】:

  • 您好,感谢您的回答... 可以代替 (searchBar shouldChangeTextInRange) 吗?
  • 是的,只需使用searchController.searchBar.text 访问搜索到的文本。
  • 所以这应该是这样的: usernameQuery.whereKey("username", matchesRegex: "(?i)" + searchController.searchBar.text) ?
  • 是的,希望你实现了UISearchBarDelegate协议?
  • 是的,我在上面添加了我现在拥有的代码。但是当我尝试搜索时没有任何反应
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 2019-04-21
相关资源
最近更新 更多