将索引添加到searchBar

时间:2015-11-18 14:04:58

标签: uitableview core-data swift2 uisearchbar xcode7

需要帮助才能更正此代码。
我有一个带有餐馆名称和地址的coredata应用程序,有一个搜索栏,它正在工作。我要添加的是Index和IndexTitle,如下图所示(箭头)。
任何帮助都非常受欢迎。提前谢谢。

import UIKit
import CoreData

class DictionaryTableViewController: UITableViewController, NSFetchedResultsControllerDelegate, UISearchResultsUpdating
{
    var searchController:UISearchController!
    var searchResults:[Dictionary] = []

    private var dictionaryItems:[Dictionary] = []
    var fetchResultController:NSFetchedResultsController!

    override func viewDidLoad() {
        super.viewDidLoad()

    if let managedObjectContext = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext {

            let fetchRequest = NSFetchRequest(entityName: "DictionaryEntity")
            do {
                dictionaryItems = try managedObjectContext.executeFetchRequest(fetchRequest) as! [Dictionary]
            } catch {
                print("Failed to retrieve record")
                print(error)
            }
        }

    searchController = UISearchController(searchResultsController: nil)
        tableView.tableHeaderView = searchController.searchBar
        searchController.searchResultsUpdater = self
        searchController.dimsBackgroundDuringPresentation = false

           tableView.estimatedRowHeight = 30.0
        tableView.rowHeight = UITableViewAutomaticDimension
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
}

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 26
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        if searchController.active {
            return searchResults.count
        } else {
            return dictionaryItems.count
        }
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! DictionaryTableViewCell

        // Configure the cell...
        cell.wordLabel.text = dictionaryItems[indexPath.row].word
        cell.definitionSmallLabel.text = dictionaryItems[indexPath.row].definition

    let dictionary = (searchController.active) ? searchResults[indexPath.row]: dictionaryItems[indexPath.row]

        // Configure the cell...
        cell.wordLabel.text = dictionary.word
        cell.definitionSmallLabel.text = dictionary.definition
        return cell
    }
override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? 
    {
        return "dictionaryItems\(section)"
    }

    override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {

           if searchController.active{
            return false
        }else{
            return true
        }
    }


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "showDictionaryDetail" {
            if let indexPath = tableView.indexPathForSelectedRow {
                let destinationController = segue.destinationViewController as! DictionaryDetailViewController
                destinationController.dictionary = (searchController.active) ? searchResults[indexPath.row] : dictionaryItems[indexPath.row]
                searchController.active = false
            }
        }
    }

        func updateSearchResultsForSearchController(searchController:
            UISearchController) {
                if let searchText = searchController.searchBar.text {
                    filterContentForSearchText(searchText)
                    tableView.reloadData()
                }
        }

        func filterContentForSearchText(searchText: String) {
            searchResults = dictionaryItems.filter({ (dictionary:Dictionary) -> Bool in
                let wordMatch = dictionary.word!.rangeOfString(searchText, options:
                    NSStringCompareOptions.CaseInsensitiveSearch)
                return wordMatch != nil
            })
        }
}



我想在表格中查看的是索引(左边的箭头)和索引标题(右边的箭头)。

enter image description here

2 个答案:

答案 0 :(得分:1)

您在 titleForHeaderInSection

的覆盖功能中存在拼写错误

以下是更正后的内容,请注意tableView中的 v 为大写:(复制粘贴我的代码)

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

}

我建议使用Xcode的自动完成功能。这样,你就不会陷入像这样的阴险错误。

<强>更新: 您还需要提供这两种方法来查看节标题和节索引标题。

override func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {
    return ["A", "B", "C"]
}

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return "A title for section: \(section)"
}

请尝试以下代码:

class TableViewController: UITableViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 9
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return 9
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

    // Configure the cell...
    cell.textLabel?.text = "\(indexPath.section+1)\(indexPath.row+1)"

    return cell
}

override func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {
    return ["A", "C", "B"]
}

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return "SECTION \(section+1)"
}

}

答案 1 :(得分:0)

执行此操作的一种方法是在NSFetchedResultsController上使用内置属性。最重要的部分是设置sectionNameKeyPath(应该是保存标题的托管对象属性)。

private var frc: NSFetchedResultsController? = nil
private lazy var fetchedResultsController:NSFetchedResultsController = {

        if self.frc != nil {
            return self.frc!
        }
        //grab your managed object context
        let moc = dbStore.sharedInstance.managedObjectContext


        let fetchRequest = NSFetchRequest(entityName: "Transaction")
        fetchRequest.fetchBatchSize = 30
        fetchRequest.resultType = NSFetchRequestResultType.ManagedObjectResultType
        let sortDescriptorByTimeStamp =  NSSortDescriptor(key: "timeStamp", ascending: true)
        fetchRequest.sortDescriptors = [sortDescriptorByTimeStamp]

        //in-memory cache when cachename is nil, delegate is non-nil
        //note the sectionNameKeyPath requires that I have a related category object with the categoryName attribute on my Transaction managed object
        let nfrc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: "category.categoryName", cacheName: nil)

        self.frc = nfrc
        do
        {
            try self.frc!.performFetch()
        } catch let e as NSError {
            fatalError(e.localizedDescription)
        }

        return self.frc!
    }()

章节标题

要获取部分标题,请执行此方法。

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        let sectionTitle = self.fetchedResultsController.sections?[section].name ?? "No Category Titles"
        return sectionTitle

}

表索引

要设置索引,请实现以下方法。

func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {

        return self.fetchedResultsController.sectionIndexTitles ?? [""]

}
  单击

注意“快速帮助文档”   sectionIndexTitles。 部分索引标题数组。默认   实现返回通过调用创建的数组   sectionIndexTitleForSectionName:在所有已知部分上。你应该   如果要为其返回不同的数组,请覆盖此方法   部分索引。如果使用节索引,则只需要此方法。

来源

如果你想在上下文中看到这一点,为了获得如何以这种方式使用NSFetchedResultsController的要点,你可以结帐my sample at this location

替代(阵列/词典)

还有一些关于如何从数组和字典构建索引的其他教程(但我推荐上述方法作为最简单的方法)。

替代实施

注意:本节中的代码来自备用教程#1

 // `UIKit` convenience class for sectioning a table
    let collation = UILocalizedIndexedCollation.currentCollation()
        as UILocalizedIndexedCollation
....
/* section headers
       appear above each `UITableView` section */
    override func tableView(tableView: UITableView,
        titleForHeaderInSection section: Int)
        -> String {
        // do not display empty `Section`s
        if !self.sections[section].users.isEmpty {
            return self.collation.sectionTitles[section] as String
        }
        return ""
    }

    /* section index titles
       displayed to the right of the `UITableView` */
    override func sectionIndexTitlesForTableView(tableView: UITableView)
        -> [AnyObject] {
        return self.collation.sectionIndexTitles
    }

    override func tableView(tableView: UITableView,
        sectionForSectionIndexTitle title: String,
        atIndex index: Int)
        -> Int {
        return self.collation.sectionForSectionIndexTitleAtIndex(index)
    }