2017-02-14 10 views
2

Как установить еще ViewController для searchResultsUpdater? Я пытался сделать это так, но результаты не обновляются.Other ViewController for searchResultsUpdater

let searchNav = storyboard!.instantiateViewController(withIdentifier: "SearchControllerNav") as! UINavigationController 
    let vc = searchNav.topViewController as! PageMenuVC 
    let searchVC = storyboard!.instantiateViewController(withIdentifier: "SearchVC") as! SearchVC 
    self.searchController = UISearchController(searchResultsController: vc) 
    vc.searchController.searchResultsUpdater = searchVC 

Вот мой PageMenuVC:

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 


    var controllerArray : [UIViewController] = [] 

    let searchVC = storyboard?.instantiateViewController(withIdentifier: "SearchVC") 
    controllerArray.append(searchVC!) 

    let testVC = storyboard?.instantiateViewController(withIdentifier: "test") 
    controllerArray.append(testVC!) 

    // Customize menu (Optional) 
    let parameters: [CAPSPageMenuOption] = [ 
     .scrollMenuBackgroundColor(UIColor(red: 30.0/255.0, green: 30.0/255.0, blue: 30.0/255.0, alpha: 1.0)), 
     .viewBackgroundColor(UIColor(red: 20.0/255.0, green: 20.0/255.0, blue: 20.0/255.0, alpha: 1.0)), 
     .selectionIndicatorColor(UIColor.orange), 
     .bottomMenuHairlineColor(UIColor(red: 70.0/255.0, green: 70.0/255.0, blue: 80.0/255.0, alpha: 1.0)), 
     .menuItemFont(UIFont(name: "HelveticaNeue", size: 13.0)!), 
     .menuHeight(40.0), 
     .menuItemWidth(90.0), 
     .centerMenuItems(true) 
    ] 

    // Initialize scroll menu 
    pageMenu = CAPSPageMenu(viewControllers: controllerArray, frame: CGRect(x: 0.0, y: 0.0, width: self.view.frame.width, height: self.view.frame.height), pageMenuOptions: nil) 

    self.addChildViewController(pageMenu!) 
    self.view.addSubview(pageMenu!.view) 
    pageMenu!.didMove(toParentViewController: self) 

} 

В SearchVC У меня есть эта функция:

//MARK: Filter 
func filterContentForSearchText(searchText: String, scope: String = "All") { 
    filteredUsers = allUsers.filter { user in 
     return user.name.lowercased().contains(searchText.lowercased()) 
    } 
    collectionView.reloadData() 
} 




//MARK: SearchResultDelegate 
func updateSearchResults(for searchController: UISearchController) { 
    let searchBarText = searchController.searchBar.text! 
    filterContentForSearchText(searchText: searchBarText) 
    self.searchController = searchController 
    collectionView.reloadData() 
} 

Если вам нужно больше информации, дайте мне знать!

+0

Надеюсь, это поможет! https://developer.apple.com/library/content/samplecode/TableSearch_UISearchController/Introduction/Intro.html – Mannopson

ответ

0

Я думаю, что вы должны держать инстанцированы контроллеры вида в (частной) собственности контроллера self вида: Если вы установите его в качестве делегата на vc.searchController.searchResultsUpdater, это только weak ссылки, поэтому, если вы не храните searchVC в self, он будет уничтожен слишком рано (только в конце блока кода). То же самое касается поискаNav (но я думаю, что это будет представлено, поэтому я пропущу его ниже):

class MyVC : UIViewController { 
    var searchVC:UIViewController? 
    // ... 
    func XYZ() { 
     let searchNav = storyboard!.instantiateViewController(withIdentifier: "SearchControllerNav") as! UINavigationController 
     let vc = searchNav.topViewController as! PageMenuVC 
     // Store searchVC in property: 
     self.searchVC = storyboard!.instantiateViewController(withIdentifier: "SearchVC") as! SearchVC 
     self.searchController = UISearchController(searchResultsController: vc) 
     vc.searchController.searchResultsUpdater = searchVC 
     self.present(searchNav, animated:true, completion:nil) 
    } 
} 
+0

Привет @Andreas, Нет, он не работает. Но я только добавил к моему вопросу больше кода. Спасибо – John

+0

Пожалуйста, проверьте (через точку останова и т. Д.), Если методы 'filterContentForSearchText' и' updateSearchResults' вызываются вообще, и если 'collectionView' является правильным видом для обновления. –

+0

Нет, это не называется. – John