【发布时间】:2017-04-07 02:38:05
【问题描述】:
我尝试将searchBar 设置为tableHeaderView 内的viewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
// SearchController initializiation
self.searchController = UISearchController.init(searchResultsController: nil)
self.searchController.delegate = self
self.searchController.searchBar.delegate = self
self.searchController.searchBar.sizeToFit()
self.searchController.searchResultsUpdater = self
self.searchController.searchBar.barTintColor = UIColor.white
self.searchController.searchBar.keyboardAppearance = .default
self.searchController.searchBar.backgroundColor = UIColor.white
self.searchController.hidesNavigationBarDuringPresentation = true
self.searchController.obscuresBackgroundDuringPresentation = false
self.tableView.tableHeaderView = self.searchController.searchBar
self.definesPresentationContext = true
self.fetch()
self.tableView.reloadData()
}
这是我的fetch() 函数:
func fetch() {
let fetchRequest:NSFetchRequest<Phone> = Phone.fetchRequest()
fetchRequest.sortDescriptors = [NSSortDescriptor.init(key: "header", ascending: true), NSSortDescriptor.init(key: "date", ascending: true)]
self.fetchedResultsController = NSFetchedResultsController.init(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: "header", cacheName: nil)
self.fetchedResultsController.delegate = self
do {
try self.fetchedResultsController.performFetch()
self.tableView.reloadData()
} catch {}
}
但我不明白它们不起作用。 Xcode 崩溃了,实际上什么也没发生。然后我尝试更改 viewDidLoad 方法内部的一些内容:
override func viewDidLoad() {
super.viewDidLoad()
self.fetch()
self.tableView.reloadData()
// SearchController initializiation
self.searchController = UISearchController.init(searchResultsController: nil)
self.searchController.delegate = self
self.searchController.searchBar.delegate = self
self.searchController.searchBar.sizeToFit()
self.searchController.searchResultsUpdater = self
self.searchController.searchBar.barTintColor = UIColor.white
self.searchController.searchBar.keyboardAppearance = .default
self.searchController.searchBar.backgroundColor = UIColor.white
self.searchController.hidesNavigationBarDuringPresentation = true
self.searchController.obscuresBackgroundDuringPresentation = false
self.tableView.tableHeaderView = self.searchController.searchBar
self.definesPresentationContext = true
}
成功!工作正常。我不明白有什么区别?
【问题讨论】:
-
崩溃时的错误信息是什么?它崩溃的确切线路是什么?请分享堆栈跟踪。
-
没什么!仅在控制台中 (lldb)
-
控制台中有信息吗?您的问题中没有足够的信息来解决您的问题。
-
@JonRose 你是说 UISearchResultsUpdating 协议吗?
-
是的。我的意思是
UISearchResultsUpdating和UISearchBarDelegate。在设置 fetchedResultsController 之前,viewController 被设置为两个不同对象(searchBar.delegate和searchResultsUpdater)的委托。因此它可以立即获取它们调用的方法。如果这些方法假定存在 fetchedResultsController 设置,则可能会导致逻辑错误。
标签: swift core-data uisearchcontroller viewdidload