Swift iOS SearchController未在ViewDidLoad中调用

时间:2016-12-22 06:42:34

标签: ios uitableview swift2 uisearchcontroller viewdidload

我有一个搜索控制器,他的视图是从另一个视图控制器呈现的。基本上我在另一个视图中有一个NavBarButton,当我按下它时会显示searchcontoller。

由于某种原因,未在viewDidLoad中调用搜索控制器。知道为什么吗?

顺便说一句我没有添加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没有调用我的searchController?

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方法,因为它们没有任何问题。

1 个答案:

答案 0 :(得分:2)

尝试将这两行移动到viewDidLoad的末尾。您的表视图来自故事板作为IBOutlet,意味着它们在viewDidLoad之前就已准备好,在tableview上调用方法tableFooterView会触发方法tableView:cellForRowAtIndexPath。由于此时尚未设置self.searchController,因此您将获得nil并崩溃。最后移动这两行可确保在数据源可用后开始表视图操作(在本例中,它是searchController)。

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

或者,您可以在self.searchController.searchBar.selectedScopeButtonIndex中检查nil,如果为numberOfRowsInSection则返回0,这样可以避免崩溃。当您致电self.tableView.reloadData()时,它会再次触发numberOfRowsInSection,而这次self.searchController.searchBar.selectedScopeButtonIndex应该准备就绪,而不是零。

相关问题