2016-04-04 18 views
0

Ayrıştırma veritabanımdaki tüm kullanıcıları, kullanıcı adlarını veya adlarını aramaya çalışıyorum. Şimdiye kadar aramalar ancak ilk harfi tanımıyor ... Bu sadece ikinci harfin yazılmasından sonra arama yapmaya başlar ve bir kez yazıldıktan sonra ilk harfi arar ...Parse.com Swift ile arama özelliği Swift

İşte benim sorgum Eğer kimse problemi görebiliyorsa yardımını çok isterim!

Daha fazla açıklama yapmak için yorum bırakın ... Çok teşekkürler.

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

DÜZENLEME Bu yüzden yukarıdaki kodu kaldırıldı ve bu ekledi:

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() 
    } 
+0

Yüklemedeki yüklenen nesnelerin tümünü indirmenizi öneririm. Ardından, kullanıcı aramalarını filtreleyin. – penatheboss

+0

Bu kaç giriş sayısına bağlı olarak bazı ciddi ek yük olabilir ... –

+0

@penatheboss Kullanıcıların bir sürü olabileceği gibi iyi bir yaklaşım olacağını düşünmüyorum .... –

cevap

0

UISearchResultsUpdating protokolünü kullanarak deneyin. Ardından, arama çubuğuna bir şey girdiğinizde updateSearchResultsForSearchController tetiklenir.

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() 
    } 
    ... 
} 

Bu yardımcı olur umarım.

+0

Merhaba, Cevabınız için teşekkürler ... Bunun yerine (searchBar shouldChangeTextInRange)? –

+0

Evet, sadece aradığınız metne '' 'searchController.searchBar.text'''' ile erişin. –

+0

Yani bu böyle olmalı: usernameQuery.whereKey ("kullanıcı adı", matchRegex: "(? I)" + searchController.searchBar.text)? –