2015-12-18 4 views
11

В iOS 9 Я использую UISearchController и отображаю его панель поиска в UIViewController, я испытываю много лаг при первом нажатии на панель поиска и пробовал все, что я могу придумать безрезультатно ... ниже мой код вместе со ссылкой на видео с задержкой - отставание происходит как на симуляторе, так и на моем устройстве.UISearchController searchbar анимация очень медленно первый раз

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

Вот ссылка на видео показывает Что происходит: http://sendvid.com/xgq81stx

Спасибо!

+0

Вы смогли найти обходной путь для этого? Я столкнулся с тем же вопросом –

+0

нет, к сожалению:/ – narciero

+0

такой же вопрос для меня. Я тоже не нашел решения. –

ответ

0

Я только когда-либо создавал контроллер поиска один раз, но я использовал UITableViewController в качестве базового класса. Вот моя реализация:

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

Я надеюсь, что это помогает :)

Смежные вопросы