2016-03-27 13 views
0

Arama fonksiyonu için ios uygulamasında çalışıyorum. Şu anda çalışmayı başardım, ancak arama sadece kullanıcı metni yazmayı bitirdiğinde ve arama düğmesini tıklattığında başlayacaktır. İlk harf girildiğinde bile sorguyu sorgulayarak hızlı bir şekilde nasıl yanıt verebilirim? UITableViewController değil, UIView denetleyicisiyle arama çubuğunu kullanıyorum.arama işlevini ui arama çubuğundaki metinle anahtar kelimeye hızlı bir şekilde yanıtlamanızı sağlar [hızlı]

// 
// CoffeeListViewController.swift 
// CoffeeApp 
// 
// Created by izzuddin on 14/03/2016. 
// Copyright © 2016 izzuddin. All rights reserved. 
// 

import UIKit 
import CloudKit 
import FBSDKCoreKit 
import FBSDKLoginKit 


class CoffeeListViewController: UIViewController { 

    ////////////////////////////OUTLET 

    @IBOutlet weak var tableview: UITableView! 
    var coffees = [Coffee]() 
    var filteredNames = [Coffee]() 

    @IBOutlet weak var searchBar: UISearchBar! 




    ////////////////////////////SPINNER 

    var loadingView = UIView() 
    var container = UIView() 
    var activityIndicator = UIActivityIndicatorView() 


    func showLoading() { 

     let win:UIWindow = UIApplication.sharedApplication().delegate!.window!! 
     self.loadingView = UIView(frame: win.frame) 
     self.loadingView.tag = 1 
     self.loadingView.backgroundColor = UIColor(red: 255/255, green: 255/255, blue: 255/255, alpha: 0) 

     win.addSubview(self.loadingView) 

     container = UIView(frame: CGRect(x: 0, y: 0, width: win.frame.width/3, height: win.frame.width/3)) 
     container.backgroundColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.6) 
     container.layer.cornerRadius = 10.0 
     container.layer.borderColor = UIColor.grayColor().CGColor 
     container.layer.borderWidth = 0.5 
     container.clipsToBounds = true 
     container.center = self.loadingView.center 


     activityIndicator.frame = CGRectMake(0, 0, win.frame.width/5, win.frame.width/5) 
     activityIndicator.activityIndicatorViewStyle = .WhiteLarge 
     activityIndicator.center = self.loadingView.center 


     self.loadingView.addSubview(container) 
     self.loadingView.addSubview(activityIndicator) 

     activityIndicator.startAnimating() 

    } 

    func hideLoading(){ 
     UIView.animateWithDuration(0.0, delay: 1.0, options: .CurveEaseOut, animations: { 
      self.container.alpha = 0.0 
      self.loadingView.alpha = 0.0 
      self.activityIndicator.stopAnimating() 
      }, completion: { finished in 
       self.activityIndicator.removeFromSuperview() 
       self.container.removeFromSuperview() 
       self.loadingView.removeFromSuperview() 
       let win:UIWindow = UIApplication.sharedApplication().delegate!.window!! 
       let removeView = win.viewWithTag(1) 
       removeView?.removeFromSuperview() 
     }) 
    } 





    ////////////////////////////LOAD DATA 
    func call_data(){ 
     self.showLoading() 

     let container = CKContainer.defaultContainer() 
     let publicData = container.publicCloudDatabase 

     let query = CKQuery(recordType: "Coffee", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil)) 
     publicData.performQuery(query, inZoneWithID: nil) { results, error in 
      if error == nil { // There is no error 
       for coffee in results! { 
        let newCoffee = Coffee() 
        newCoffee.name = coffee["Name"] as! String 
        newCoffee.cafe = coffee["Cafe"] as! String 
        newCoffee.rating = coffee["Rating"] as! Double 
        newCoffee.place = coffee["Place"] as? CLLocation 

        self.coffees.append(newCoffee) 


        dispatch_async(dispatch_get_main_queue(), {() -> Void in 
         self.tableview.reloadData() 
         self.hideLoading() 

        }) 
       } 
      } 
      else { 
       print(error) 
      } 
     } 
    } 




    //////////////////////////////////////////////////VIEW DID LOAD 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     call_data() 

    } 





    //////////////////////////////////////////////////PREPARE SEGUE 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 


     if segue.identifier == "AddCoffeeVC" { 
      let destVC: AddCoffeeViewController = segue.destinationViewController as! AddCoffeeViewController 
      destVC.delegate = self 
     } 

     if segue.identifier == "showCoffeeVC" { 
      let destVC: ShowCoffeeViewController = segue.destinationViewController as! ShowCoffeeViewController 

      if let selectedIndexPath = self.tableview.indexPathForSelectedRow { 
       let coffee: Coffee = self.coffees[selectedIndexPath.row] 
       destVC.coffeeDetail = coffee 
      } 

     } 

    } 



} 




    ////////////////////////////PASSING BACK DATA 

    extension CoffeeListViewController : AddCoffeeDelegate{ 

    func viewController(vc: AddCoffeeViewController, didAddCoffee coffee: Coffee!) { 
     self.coffees.append(coffee) 

     //create the cloudkit record here 
     let container = CKContainer.defaultContainer() 
     let publicData = container.publicCloudDatabase 


     let record = CKRecord(recordType: "Coffee") 
     record.setValue(coffee.name, forKey: "Name") 
     record.setValue(coffee.cafe, forKey: "Cafe") 
     record.setValue(coffee.rating, forKey: "Rating") 
     record.setValue(coffee.place, forKey: "Place") 
     publicData.saveRecord(record, completionHandler: { record, error in 
      if error != nil { 
       print(error) 
      } 
     }) 


     self.dismissViewControllerAnimated(true, completion: nil) 
     self.tableview.reloadData() 
    } 
} 





    ////////////////////////////////////////////////// ADPOPT TABLE VIEW 

    extension CoffeeListViewController : UITableViewDelegate, UITableViewDataSource{ 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ 

     return self.coffees.count 

    } 


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ 
     let cell = tableView.dequeueReusableCellWithIdentifier("CoffeeCell", forIndexPath: indexPath) 

     let coffee = coffees[indexPath.row] 
     cell.textLabel!.text = coffee.name 
     cell.detailTextLabel!.text = "\(coffee.rating)" 
     return cell 
    } 

} 





    ////////////////////////////////////////////////// SEARCH BAR 


    extension CoffeeListViewController : UISearchBarDelegate { 

    func searchBarShouldEndEditing(searchBar: UISearchBar)-> Bool{ 
     searchBar.showsCancelButton = true 
     return searchBar.showsCancelButton.boolValue 
    } 

    func searchBarShouldBeginEditing(searchBar: UISearchBar) -> Bool{ 
     searchBar.showsCancelButton = true 
     return searchBar.showsCancelButton.boolValue 

    } 

    func searchBarCancelButtonClicked(searchBar: UISearchBar){ 
     searchBar.resignFirstResponder() 
     searchBar.setShowsCancelButton(false, animated: false) 
     call_data() 


    } 

    func searchBarSearchButtonClicked(searchBar: UISearchBar){ 
     searchBar.resignFirstResponder() 
    } 

    func searchBarTextDidEndEditing(searchBar: UISearchBar){ 

     var empty_array: [Coffee] = [] 

     for coffee in coffees{ 
      if searchBar.text?.lowercaseString == coffee.name { 
       empty_array.append(coffee) 
      } 
     } 
     self.coffees = empty_array 
     self.tableview.reloadData() 

     NSLog("\(searchBar.text)") 


    } 


} 

cevap

0

Sen searchBarTextDidEndEditing üzerinde arama tetikleyen:

burada benim kodudur. Bunun yerine, kullanıcının her karakteri eklediğinde veya kaldırdığında çağrılan searchBar:textDidChange:'u kullanın.

(Ancak, UISearchController burada kullanıyorsanız gerçekten daha iyi olurdu. Sonuçta, bunun tam olarak ne için olduğunu.)

İlgili konular