gpt4 book ai didi

ios - 快速添加范围栏

转载 作者:IT王子 更新时间:2023-10-29 05:36:53 26 4
gpt4 key购买 nike

该应用程序在带有搜索栏的表格 View 中显示了它正在使用的汽车零件列表(汽车零件、类型、年份、国家/地区)。

现在我决定添加一个范围栏来过滤结果,而且我确信我弄乱了代码。添加 scopeBar 的行中有很多错误。这是最后 20 行,在注释 //ScopeBar try 之后,除了这最后几行,我在 viewDidLoad() 中添加了一段代码来显示我想要的标题。

我做错了什么?任何帮助都非常受欢迎,我已经尝试解决这个问题 2 天了,但没有成功。

import UIKit
import CoreData

class DictionaryTableViewController: UITableViewController, NSFetchedResultsControllerDelegate, UISearchResultsUpdating
{

var searchController:UISearchController!
var searchResults:[Dictionary] = []

private var dictionaryItems:[Dictionary] = []

private var cockpitDict = [String: [Dictionary]]()
var sectionTitles = [String]()

var fetchResultController:NSFetchedResultsController!

override func viewDidLoad() {
super.viewDidLoad()


// ScopeBar Try
searchController.searchBar.scopeButtonTitles = ["All", "type", "year", "country"]
tableView.tableHeaderView = searchController.searchBar



// Load menu items from database
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
searchController.searchBar.placeholder = "Search ..."

navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style:
.Plain, target: nil, action: nil)

// Enable self sizing cells
tableView.estimatedRowHeight = 100.0
tableView.rowHeight = UITableViewAutomaticDimension


createCockpitDict()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

func createCockpitDict(){

for item in dictionaryItems {

guard let word = item.word else {
break
}

// Get the first letter of the word and build the dictionary
let wordKey = word.substringToIndex(word.startIndex.advancedBy(1))
if var cockpitItems = cockpitDict[wordKey] {
cockpitItems.append(item)
cockpitDict[wordKey] = cockpitItems
} else {
cockpitDict[wordKey] = [item]
}
}

// Get the section titles from the dictionary's keys and sort them in ascending order
sectionTitles = [String](cockpitDict.keys)
sectionTitles = sectionTitles.sort({ $0 < $1 })
}

// create a standard way to get a Dictionary from a index path
func itemForIndexPath (indexPath: NSIndexPath) -> Dictionary? {
var result: Dictionary? = nil

if searchController.active {
result = searchResults[indexPath.row]
}else{
let wordKey = sectionTitles[indexPath.section]
if let items = cockpitDict[wordKey]{
result = items[indexPath.row]
}
}
return result
}

// MARK: - Table view data source

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return sectionTitles[section]
}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
//assume a single section after a search
return (searchController.active) ? 1 : sectionTitles.count
}

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

if searchController.active {
return searchResults.count
} else {
// Return the number of rows in the section.
let wordKey = sectionTitles[section]
if let items = cockpitDict[wordKey] {
return items.count
}

return 0
}
}


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

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

//let dictionary = (searchController.active) ? searchResults[indexPath.row]: dictionaryItems[indexPath.row]
if let dictionary = itemForIndexPath(indexPath){
cell.wordLabel.text = dictionary.word
cell.definitionSmallLabel.text = dictionary.definition
cell.typeLabel.text = dictionary.type
cell.yearLabel.text = dictionary.year
cell.countryLabel.text = dictionary.country


}else{
print("Cell error with path\(indexPath)")
}
return cell
}

override func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {
return sectionTitles
}

// Override to support conditional editing of the table view.
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// Return false if you do not want the specified item to be editable.
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
if let dictionary = itemForIndexPath(indexPath){
destinationController.dictionary = dictionary
}else{
print("Segue error with path \(indexPath)")
}
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
})
}
}

//ScopeBar try: all lines below got many errors I can not figure out how to fix it :(

func filterContentForSearchText(searchText: String, scope: String = "All") {
dictionaryItems = cockpitDict.filter({( cockpitDict : Dictionary) -> Bool in
let categoryMatch = (scope == "All") || (cockpitDict.category == scope)
return categoryMatch && cockpitDict.name.lowercaseString.containsString(searchText.lowercaseString)
})
tableView.reloadData()
}

extension DictionaryTableViewController:UISearchBarDelegate {
// MARK: - UISearchBar Delegate
func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
filterContentForSearchText(searchBar.text!, scope: searchBar.scopeButtonTitles![selectedScope])
}
}

extension DictionaryTableViewController: UISearchResultsUpdating {
// MARK: - UISearchResultsUpdating Delegate
func updateSearchResultsForSearchController(searchController: UISearchController) {
let searchBar = searchController.searchBar
let scope = searchBar.scopeButtonTitles![searchBar.selectedScopeButtonIndex]
filterContentForSearchText(searchController.searchBar.text!, scope: scope)
}
}

最佳答案

我浏览了github中提供的全部代码并解决了它

将您的 viewDidLoad 更改为

 override func viewDidLoad() {
super.viewDidLoad()

// Load menu items from database
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
searchController.searchBar.placeholder = "Search ..."

// you were setting before initialization
searchController.searchBar.scopeButtonTitles = ["All", "type", "year", "country"]

navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style:
.Plain, target: nil, action: nil)

// Enable self sizing cells
tableView.estimatedRowHeight = 100.0
tableView.rowHeight = UITableViewAutomaticDimension


createCockpitDict()
}

和最后一个作用域栏过滤

func filterContentForSearchText(var searchText: String, scope: NSInteger) {


searchText = searchText.lowercaseString;

func checkString(strData: String, strSearchData: String)-> Bool{
return strData.rangeOfString(strSearchData, options:
NSStringCompareOptions.CaseInsensitiveSearch) != nil
}

searchResults = dictionaryItems.filter({ (dictionary:Dictionary) -> Bool in

switch scope {
case 0:
return (checkString(dictionary.word!, strSearchData: searchText) || checkString(dictionary.type!, strSearchData: searchText) || checkString(dictionary.country!, strSearchData: searchText) || checkString(dictionary.year!, strSearchData: searchText))
case 1:
return checkString(dictionary.type!, strSearchData: searchText)
case 2:
return checkString(dictionary.year!, strSearchData: searchText)
case 3:
return checkString(dictionary.country!, strSearchData: searchText)
default:
return true;
}

})

tableView.reloadData()

}


// MARK: - UISearchBar Delegate
func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
filterContentForSearchText(searchBar.text!, scope: searchBar.selectedScopeButtonIndex)
}



// MARK: - UISearchResultsUpdating Delegate - comment older method so duplicate method error will be vanished
func updateSearchResultsForSearchController(searchController: UISearchController) {
let searchBar = searchController.searchBar
filterContentForSearchText(searchController.searchBar.text!, scope: searchBar.selectedScopeButtonIndex)
}

关于ios - 快速添加范围栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35702892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com