2015-12-18 13 views
11

In iOS 9 benutze ich UISearchController und Anzeige seiner Suchleiste in einem UIViewController, ich erfahre eine Menge Verzögerung das erste Mal, wenn ich auf die Suchleiste klicke und habe alles versucht, was ich mir vorstellen kann ohne Erfolg ... unten ist mein Code zusammen mit einem Link zu einem Video des Lags passiert - die Verzögerung passiert sowohl auf dem Simulator und mein Gerät.UISearchController Suchleiste Animation sehr langsam erstmalig

func setupUI() { 
    self.view.backgroundColor = UIColor.whiteColor() 

    // Required to properly display searchbar within nav & tabbar controllers 
    self.extendedLayoutIncludesOpaqueBars = true // have tried setting this to false as well 
    self.definesPresentationContext = true 

    self.searchResultsController = AppDelegate.getViewController(ScheduleStoryboard.name, controllerName: ScheduleStoryboard.Identifiers.foodSearchResults) as? SearchResultsController 

    self.searchController = UISearchController(searchResultsController: searchResultsController) 
    self.searchController.searchResultsUpdater = self 
    self.searchController.delegate = self 
    self.searchController.dimsBackgroundDuringPresentation = true 

    self.searchController.searchBar.delegate = self 
    self.searchController.searchBar.placeholder = "Search foods..." 
    self.searchController.searchBar.setBackgroundImage(UIImage(named: "background-searchbar")?.resizableImageWithCapInsets(UIEdgeInsetsMake(0, 0, 0, 0)), forBarPosition: .Any, barMetrics: .Default) 
    self.searchController.searchBar.tintColor = UIColor.whiteColor() 
    self.searchController.searchBar.sizeToFit() 

    // this headerView does NOT belong to the tableView, its anchored on top of the tableView so that the searchbar remains fixed when scrolling 
    self.headerView.addSubview(searchController.searchBar) 

    self.tableView.delegate = self 
    self.tableView.dataSource = self 
    self.tableView.tableHeaderView?.backgroundColor = UIColor.clearColor() 
    self.tableView.tableHeaderView?.addBorder(.Bottom, color: UIColor.groupTableViewBackgroundColor(), width: 0.25) 

    self.segmentedControl.tintColor = UIColor.genioBlue() 
} 

Hier ist ein Link zu dem Video, das zeigt, was geschieht: http://sendvid.com/xgq81stx

Dank!

+0

Können Sie eine Abhilfe für diese finden? Ich bin mit dem gleichen Problem konfrontiert –

+0

nein leider:/ – narciero

+0

gleiche Frage für mich auch. Ich habe auch keine Lösung gefunden. –

Antwort

0

Ich habe nur einmal einen Suchcontroller erstellt, aber ich habe einen UITableViewController als meine Basisklasse verwendet. Hier ist meine Umsetzung:

class SearchController: UITableViewController { 
    let searchController = UISearchController(searchResultsController: nil) 
    var items:[ArrayOfYourType] 
    var filteredItems:[ArrayOfYourType] 
    var scopeTitles:[String]? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    searchController.searchResultsUpdater = self 
    searchController.dimsBackgroundDuringPresentation = false 
    definesPresentationContext = true 
    tableView.tableHeaderView = searchController.searchBar 

    searchController.searchBar.scopeButtonTitles = scopeTitles 
    searchController.searchBar.delegate = self 
} 

// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if searchController.active { 
     return filteredItems.count 
    } 
    return items.count 
} 

func filterContentForSearchText(searchText: String, scope: String = "All") { 
    filteredItems = items.filter { item in 
     //return true or false depending on your filter 
     return true 
    } 
    dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     self.tableView.reloadData() 
    }) 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, 
     reuseIdentifier: nil) 
    let item: String 
    let category: String 
    if searchController.active { 
     item = filteredItems[indexPath.row].getTitle() 
     category = filteredItems[indexPath.row].getCategory() 
    } 
    else { 
     item = items[indexPath.row].getTitle() 
     category = items[indexPath.row].getCategory() 
    } 
    cell.textLabel?.text = item 
    cell.detailTextLabel?.text = category 
    return cell 
} 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    //your code here 
} 
} 

//MARK: UISearchResultsUpdating 
extension SearchController: UISearchResultsUpdating { 
    func updateSearchResultsForSearchController(searchController: UISearchController) { 
     if let _ = scopeTitles { 
      let searchBar = searchController.searchBar 
      let scope = searchBar.scopeButtonTitles![searchBar.selectedScopeButtonIndex] 
      filterContentForSearchText(searchController.searchBar.text!,scope:scope) 
     } 
     else { 
      filterContentForSearchText(searchController.searchBar.text!) 
     } 
    } 
} 

//MARK: UISearchBarDelegate 
extension SearchController: UISearchBarDelegate { 
    func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) { 
     filterContentForSearchText(searchBar.text!, scope: searchBar.scopeButtonTitles![selectedScope]) 
    } 
} 

Ich hoffe, das hilft :)