【问题标题】:UISearchBar segue in CoreData using didSelectRowAtIndexPath使用 didSelectRowAtIndexPath 在 CoreData 中的 UISearchBar segue
【发布时间】:2015-03-01 15:12:47
【问题描述】:

我将一个 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 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($0)
            } 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()
}

【问题讨论】:

    标签: ios core-data uisearchbar segue didselectrowatindexpath


    【解决方案1】:

    我知道当你盯着你的代码太久以至于你错过了明显的感觉时:

    selectedNote = self.searchController.filteredObjects[indexPath.row] 
    

    应该是

    if let filteredObjects = filteredObjects {
        selectedNote = filteredObjects[indexPath.row]
    } 
    

    因为您已将 filteredObjects 声明为您的 MasterViewController 的实例变量

    【讨论】:

    • 编译器现在说:Cannot subscript a value of type '[Note]?' with an index of type 'Int'.
    • 编辑了我的答案 - 你需要先解开可选的。此外,swift 的首选样式是引用没有self 的实例变量,除非有必要
    • 祝您工作顺利! ;)
    • 是的,这应该消除将segue附加到单元格的需要。
    • 这是您在 InterfaceBuilder > Identity Inspector 选项卡 > Storyboard ID 字段中为 ViewController 指定的字符串
    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 2014-09-11
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多