2016-12-22 4 views
-1

У меня есть контроллер поиска, который отображается с другого контроллера вида. В основном у меня есть NavBarButton внутри другого представления, и когда я нажимаю на него, отображается searchcontoller.Swift iOS SearchController, не вызываемый в ViewDidLoad

По какой-либо причине контроллер поиска не вызывается в viewDidLoad. Любая идея почему?

Btw Я не добавлял методы tableView, потому что это не то, где у меня проблема. Когда я положил точку останова на var searchController: UISearchController!, он попал в нее.

Внутри viewDidLoad, когда я поставил точку останова на searchController(anything), она пропускает ее, так что это проблема.

Внутри numberOfRowsInSection... Когда я положил точку останова на let scopeButtonIndex = self.searchController.searchBar.selectedScopeButtonIndex, и когда я нажимаю кнопку «Продолжить», здесь происходит сбой, потому что selectedScopeButtonIndex возвращает значение Nil. Я понял, что это ноль, потому что он не вызван в viewDidLoad self.searchController.searchBar.scopeButtonTitles = ["Sneaker Name","Sneaker Condition"]

Почему viewDidLoad не вызывает мой поискController?

class SearchViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating, UISearchBarDelegate, UISearchControllerDelegate { 

@IBOutlet weak var tableView: UITableView! 

var searchController: UISearchController! 

var userContent = [Sneakers]() 
var filteredSearchSneakerNames = [Sneakers]() 
var filteredSearchSneakerConditions = [Sneakers]() 

override func viewDidLoad() { 
     super.viewDidLoad() 

     let backgroundColor = UIView(frame: CGRectZero) 
     self.tableView.tableFooterView = backgroundColor 

     //Nothing below this comment inside viewDidLoad is being called 
     self.tableView.backgroundColor = UIColor.whiteColor() 
     self.searchController = UISearchController(searchResultsController: nil) 
     self.searchController.delegate = self 
     self.searchController.searchBar.delegate = self 
     self.searchController.searchResultsUpdater = self 
     self.searchController.searchBar.showsCancelButton = true 
     self.searchController.searchBar.placeholder = "Search..." 
     self.searchController.searchBar.scopeButtonTitles = ["Sneaker Name","Sneaker Condition"] 
     self.searchController.searchBar.returnKeyType = .Done 
     self.navigationItem.hidesBackButton = true 
     self.searchController.dimsBackgroundDuringPresentation = false 
     self.navigationItem.titleView = searchController.searchBar 
     self.searchController.hidesNavigationBarDuringPresentation = false 
     self.definesPresentationContext = true 
     self.searchController.searchBar.sizeToFit() 
     self.tableView.tableHeaderView = self.searchController.searchBar 
     self.tableView.reloadData() 
    } 

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

    //I put a breakpoint here and it crashes 
    let scopeButtonIndex = self.searchController.searchBar.selectedScopeButtonIndex 

    if scopeButtonIndex == 0{ 
     return self.filteredSearchSneakerNames.count 
    }else{ 
     return self.filteredSearchSneakerConditions.count 
    } 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath...){ 
... 
} 

deinit{ 
     self.searchController = nil 
    } 

} 

я не добавлял в updateSearchResultsForSearchController или любой из других методов searchController, потому что они не имея каких-либо проблем.

ответ

2

Попробуйте переместить эти две строки в конец viewDidLoad. Ваш табличный вид поступает из раскадровки как IBOutlet, то есть они готовы перед viewDidLoad, вызывая метод tableFooterView в tableview вызывает метод tableView: cellForRowAtIndexPath. Поскольку ваш self.searchController еще не настроен на данный момент, вы получите нуль и потерпите крах. Перемещение этих двух строк в конце гарантирует, что операция для представления таблицы начинается после того, как доступен ваш источник данных (в этом случае это searchController).

let backgroundColor = UIView(frame: CGRectZero) 
self.tableView.tableFooterView = backgroundColor 

В качестве альтернативы, вы можете проверить на ноль в self.searchController.searchBar.selectedScopeButtonIndex, возвращать 0 в numberOfRowsInSection если это правда, это позволит избежать аварии. Когда вы позвоните self.tableView.reloadData(), он снова запустит numberOfRowsInSection, и на этот раз self.searchController.searchBar.selectedScopeButtonIndex должен быть готов, а не ноль.

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