Swift iOS SearchController 未在 ViewDidLoad 中调用
Swift iOS SearchController not Being Called in ViewDidLoad
我有一个搜索控制器,它的视图是从另一个视图控制器呈现的。基本上我在另一个视图中有一个 NavBarButton,当我按下它时,会显示 searchcontoller。
出于某种原因,搜索控制器未在 viewDidLoad 中调用。知道为什么吗?
顺便说一句,我没有添加 tableView 方法,因为那不是我遇到问题的地方。当我在 var searchController: UISearchController!
上设置断点时,它会命中。
当我在 searchController(anything)
上放置断点时,在 viewDidLoad 内部它会跳过它,所以这就是问题所在。
内部 numberOfRowsInSection...
当我在 let scopeButtonIndex = self.searchController.searchBar.selectedScopeButtonIndex
上放置一个断点并按下继续时,它会在这里崩溃,因为 selectedScopeButtonIndex returns 为 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 方法,因为它们没有任何问题。
尝试将这两行移动到viewDidLoad的末尾。您的 table 视图作为 IBOutlet 来自故事板,这意味着它们在 viewDidLoad 之前准备就绪,在 table 视图上调用方法 tableFooterView 会触发方法 tableView:cellForRowAtIndexPath。由于此时您的 self.searchController 尚未设置,您将得到 nil 并崩溃。将这两行移到最后确保 table 视图的操作在您的数据源可用后开始(在本例中,它是 searchController)。
let backgroundColor = UIView(frame: CGRectZero)
self.tableView.tableFooterView = backgroundColor
或者,您可以检查 self.searchController.searchBar.selectedScopeButtonIndex
中的 nil,numberOfRowsInSection
中的 return 0 如果为真,这将避免崩溃。当你调用self.tableView.reloadData()
时它会再次触发numberOfRowsInSection
,这次self.searchController.searchBar.selectedScopeButtonIndex
应该准备好了,而不是nil。
我有一个搜索控制器,它的视图是从另一个视图控制器呈现的。基本上我在另一个视图中有一个 NavBarButton,当我按下它时,会显示 searchcontoller。
出于某种原因,搜索控制器未在 viewDidLoad 中调用。知道为什么吗?
顺便说一句,我没有添加 tableView 方法,因为那不是我遇到问题的地方。当我在 var searchController: UISearchController!
上设置断点时,它会命中。
当我在 searchController(anything)
上放置断点时,在 viewDidLoad 内部它会跳过它,所以这就是问题所在。
内部 numberOfRowsInSection...
当我在 let scopeButtonIndex = self.searchController.searchBar.selectedScopeButtonIndex
上放置一个断点并按下继续时,它会在这里崩溃,因为 selectedScopeButtonIndex returns 为 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 方法,因为它们没有任何问题。
尝试将这两行移动到viewDidLoad的末尾。您的 table 视图作为 IBOutlet 来自故事板,这意味着它们在 viewDidLoad 之前准备就绪,在 table 视图上调用方法 tableFooterView 会触发方法 tableView:cellForRowAtIndexPath。由于此时您的 self.searchController 尚未设置,您将得到 nil 并崩溃。将这两行移到最后确保 table 视图的操作在您的数据源可用后开始(在本例中,它是 searchController)。
let backgroundColor = UIView(frame: CGRectZero)
self.tableView.tableFooterView = backgroundColor
或者,您可以检查 self.searchController.searchBar.selectedScopeButtonIndex
中的 nil,numberOfRowsInSection
中的 return 0 如果为真,这将避免崩溃。当你调用self.tableView.reloadData()
时它会再次触发numberOfRowsInSection
,这次self.searchController.searchBar.selectedScopeButtonIndex
应该准备好了,而不是nil。