使用 didSelectRowAtIndexPath 在 CoreData 中使用 UISearchBar segue
UISearchBar segue in CoreData using didSelectRowAtIndexPath
我有一个 Core Data 项目设置为 Master-Detail VC。我添加了一个 UISearchBar
到它正常工作。当我点击单元格时,它垄断了我不好意思承认的大量时间(这很糟糕)是让它正确显示详细信息。
我一直在尝试使用 prepareForSegue
,但我的导师建议我使用 didSelectRowAtIndexPath
来转至 DetailVC
.
这是我尝试做的事情:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
var selectedNote: Note
// Check to see which table view cell was selected.
if tableView == self.tableView {
selectedNote = self.fetchedResultsController.objectAtIndexPath(indexPath) as! Note
} else {
selectedNote = self.searchController.filteredObjects[indexPath.row]
}
// Set up the detail view controller to show.
let detailViewController = DetailViewController()
// Note: Should not be necessary but current iOS 8.0 bug requires it.
tableView.deselectRowAtIndexPath(tableView.indexPathForSelectedRow()!, animated: false)
navigationController?.pushViewController(detailViewController, animated: true)
}
对于上面的代码,编译器说 'UISearchController' does not have a member named 'filteredObjects'
我很困惑,因为我已经在 MasterViewController
class.
的顶部进行了设置
这是设置信息:
class MasterViewController: UITableViewController, NSFetchedResultsControllerDelegate, UISearchControllerDelegate, UISearchResultsUpdating, UISearchBarDelegate {
var detailViewController: DetailViewController? = nil
var addNoteViewController:AddNoteViewController? = nil
var managedObjectContext: NSManagedObjectContext? = nil
// Added variable for UISearchController
var searchController: UISearchController!
var searchPredicate: NSPredicate?
var filteredObjects : [Note]? = nil
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.leftBarButtonItem = self.editButtonItem()
if let split = self.splitViewController {
let controllers = split.viewControllers
let context = self.fetchedResultsController.managedObjectContext
let entity = self.fetchedResultsController.fetchRequest.entity!
self.detailViewController = controllers[controllers.count-1].topViewController as? DetailViewController
}
// UISearchController setup
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
searchController.searchResultsUpdater = self
searchController.delegate = self
searchController.searchBar.sizeToFit()
self.tableView.tableHeaderView = searchController?.searchBar
self.tableView.delegate = self
self.definesPresentationContext = false
}
以下是 UISearchBar 方法:
// MARK: - UISearchResultsUpdating Delegate Method
// Called when the search bar's text or scope has changed or when the search bar becomes first responder.
func updateSearchResultsForSearchController(searchController: UISearchController) {
let searchText = self.searchController?.searchBar.text // steve put breakpoint
println(searchController.searchBar.text)
if let searchText = searchText {
// This sets up the seachPredicate and filteredObjects array
searchPredicate = NSPredicate(format: "noteBody contains[c] %@ OR noteTitle contains[c] %@", searchText, searchText)
filteredObjects = self.fetchedResultsController.fetchedObjects?.filter() {
return self.searchPredicate!.evaluateWithObject([=12=])
} as! [Note]?
self.tableView.reloadData()
println(searchPredicate)
}
}
// MARK: - UISearchBar Delegate methods
func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
updateSearchResultsForSearchController(self.searchController)
}
// This resets searchPredicate & filteredObjects when the SearchController is dismissed
func didDismissSearchController(searchController: UISearchController) {
println("didDismissSearchController")
self.searchPredicate = nil
self.filteredObjects = nil
self.tableView.reloadData()
}
我知道当你盯着你的代码看得太久以至于你错过了明显的感觉时的感觉:
selectedNote = self.searchController.filteredObjects[indexPath.row]
应该是
if let filteredObjects = filteredObjects {
selectedNote = filteredObjects[indexPath.row]
}
因为您已将 filteredObjects
声明为 MasterViewController
的实例变量
我有一个 Core Data 项目设置为 Master-Detail VC。我添加了一个 UISearchBar
到它正常工作。当我点击单元格时,它垄断了我不好意思承认的大量时间(这很糟糕)是让它正确显示详细信息。
我一直在尝试使用 prepareForSegue
,但我的导师建议我使用 didSelectRowAtIndexPath
来转至 DetailVC
.
这是我尝试做的事情:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
var selectedNote: Note
// Check to see which table view cell was selected.
if tableView == self.tableView {
selectedNote = self.fetchedResultsController.objectAtIndexPath(indexPath) as! Note
} else {
selectedNote = self.searchController.filteredObjects[indexPath.row]
}
// Set up the detail view controller to show.
let detailViewController = DetailViewController()
// Note: Should not be necessary but current iOS 8.0 bug requires it.
tableView.deselectRowAtIndexPath(tableView.indexPathForSelectedRow()!, animated: false)
navigationController?.pushViewController(detailViewController, animated: true)
}
对于上面的代码,编译器说 'UISearchController' does not have a member named 'filteredObjects'
我很困惑,因为我已经在 MasterViewController
class.
这是设置信息:
class MasterViewController: UITableViewController, NSFetchedResultsControllerDelegate, UISearchControllerDelegate, UISearchResultsUpdating, UISearchBarDelegate {
var detailViewController: DetailViewController? = nil
var addNoteViewController:AddNoteViewController? = nil
var managedObjectContext: NSManagedObjectContext? = nil
// Added variable for UISearchController
var searchController: UISearchController!
var searchPredicate: NSPredicate?
var filteredObjects : [Note]? = nil
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.leftBarButtonItem = self.editButtonItem()
if let split = self.splitViewController {
let controllers = split.viewControllers
let context = self.fetchedResultsController.managedObjectContext
let entity = self.fetchedResultsController.fetchRequest.entity!
self.detailViewController = controllers[controllers.count-1].topViewController as? DetailViewController
}
// UISearchController setup
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
searchController.searchResultsUpdater = self
searchController.delegate = self
searchController.searchBar.sizeToFit()
self.tableView.tableHeaderView = searchController?.searchBar
self.tableView.delegate = self
self.definesPresentationContext = false
}
以下是 UISearchBar 方法:
// MARK: - UISearchResultsUpdating Delegate Method
// Called when the search bar's text or scope has changed or when the search bar becomes first responder.
func updateSearchResultsForSearchController(searchController: UISearchController) {
let searchText = self.searchController?.searchBar.text // steve put breakpoint
println(searchController.searchBar.text)
if let searchText = searchText {
// This sets up the seachPredicate and filteredObjects array
searchPredicate = NSPredicate(format: "noteBody contains[c] %@ OR noteTitle contains[c] %@", searchText, searchText)
filteredObjects = self.fetchedResultsController.fetchedObjects?.filter() {
return self.searchPredicate!.evaluateWithObject([=12=])
} as! [Note]?
self.tableView.reloadData()
println(searchPredicate)
}
}
// MARK: - UISearchBar Delegate methods
func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
updateSearchResultsForSearchController(self.searchController)
}
// This resets searchPredicate & filteredObjects when the SearchController is dismissed
func didDismissSearchController(searchController: UISearchController) {
println("didDismissSearchController")
self.searchPredicate = nil
self.filteredObjects = nil
self.tableView.reloadData()
}
我知道当你盯着你的代码看得太久以至于你错过了明显的感觉时的感觉:
selectedNote = self.searchController.filteredObjects[indexPath.row]
应该是
if let filteredObjects = filteredObjects {
selectedNote = filteredObjects[indexPath.row]
}
因为您已将 filteredObjects
声明为 MasterViewController