使用 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

的实例变量