我正在尝试使用swift中的搜索显示功能实现搜索栏,以获得下面的表格视图。
表格视图的屏幕截图
我遇到了问题,因为我的字符串数组采用以下格式。
["section name1" : ["list1", "list2"] ,"section name2" : ["list3", "list4"]]
我在表格视图中添加了以下代码。
@IBOutlet weak var dishtable: UITableView!
@IBOutlet weak var namlbl: UILabel!
var Dishes = ["POPULAR Dishes": ["Biryani", "Tandori Chicken","Butter Chicken", "Vada Pav"],"A": ["Aloo baingan", "Aloo ki Tikki", "Amritsari fish"], "B": ["Baigan bharta", "Biryani"]];
var Filterval = ["POPULAR Dishes": ["Biryani", "Tandori Chicken","Butter Chicken", "Vada Pav"],"A": ["Aloo baingan", "Aloo ki Tikki", "Amritsari fish"], "B": ["Baigan bharta", "Biryani"]];
struct dish {
let Dish : [String]
}
override func viewDidLoad() {
super.viewDidLoad()
self.dishtable.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
dishtable.dataSource = self
dishtable.delegate = self
// Do any additional setup after loading the view.
}
func filterContentForSearchText(searchText: String) {
// Filter the array using the filter method
self.Filterval = self.Dishes.filter({( d: dish) -> Bool in
let DishMatch = (d.Dish == scope)
let stringMatch = d.Dish.rangeOfString(searchText)
return DishMatch && (stringMatch != nil)
})
}
func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchString searchString: String!) -> Bool {
self.filterContentForSearchText(searchString)
return true
}
func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchScope searchOption: Int) -> Bool {
self.filterContentForSearchText(self.searchDisplayController!.searchBar.text!)
return true
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func prefersStatusBarHidden() -> Bool {
return true
}
let sections:Array<AnyObject> = ["POPULAR Dishes","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
var usernames = [String]()
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
let cellID = "cell"
let cell: UITableViewCell = self.dishtable.dequeueReusableCellWithIdentifier(cellID) as! UITableViewCell
println("value : \(indexPath.section)")
println("value 1: \(indexPath.row)")
var d : dish
if tableView == self.searchDisplayController!.searchResultsTableView {
cell.textLabel!.text = Filterval[sections[indexPath.section] as! String]![indexPath.row]
} else {
cell.textLabel!.text = Dishes[sections[indexPath.section] as! String]![indexPath.row]
}
return cell
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
println("Dishes section count : \(section)")
if tableView == self.searchDisplayController!.searchResultsTableView {
if section == 0 {
return Filterval["POPULAR Dishes"]!.count
}
else if section == 1 {
return Filterval["A"]!.count
}
else if section == 2 {
return Filterval["B"]!.count
}
else if section == 3 {
return Filterval["C"]!.count
}
else if section == 4 {
return Filterval["D"]!.count
}
else if section == 5 {
return Filterval["E"]!.count
}
else if section == 6 {
return Filterval["F"]!.count
}
return 0
} else {
if section == 0 {
return Dishes["POPULAR Dishes"]!.count
}
else if section == 1 {
return Dishes["A"]!.count
}
else if section == 2 {
return Dishes["B"]!.count
}
else if section == 3 {
return Dishes["C"]!.count
}
else if section == 4 {
return Dishes["D"]!.count
}
else if section == 5 {
return Dishes["E"]!.count
}
else if section == 6 {
return Dishes["F"]!.count
}
return 0
}
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int{
return 27
}
func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
}
func tableView(tableView: UITableView,
sectionForSectionIndexTitle title: String,
atIndex index: Int) -> Int{
return index
}
func tableView(tableView: UITableView,
titleForHeaderInSection section: Int) -> String?{
return self.sections[section] as? String
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
tableView.deselectRowAtIndexPath(indexPath, animated: true)
var ban = ""
ban = Dishes[sections[indexPath.section] as! String]![indexPath.row]
println(ban)
}
我在线尝试了以下链接,但无法实现搜索功能。
答案 0 :(得分:1)
我做了以下更改并获得了所需的输出。
我将我的字符串数组存储在Core Data中,并在Core Data中为POPUlAR FOOD标记并获取这些细节并根据字母存储在不同的数组中。
创建一个开关案例以显示表格视图中的部分。
var distinctstring = [String]()
var arr = [String]()
var arrA = [String]()
var arrB = [String]()
var arrC = [String]()
var arrD = [String]()
var arrE = [String]()
var arrF = [String]()
var arrG = [String]()
var arrH = [String]()
var arrI = [String]()
var arrJ = [String]()
var arrK = [String]()
var arrL = [String]()
var arrM = [String]()
var arrN = [String]()
var arrV = [String]()
var arrX = [String]()
var arrZ = [String]()
var arrP = [String]()
var arrO = [String]()
var arrY = [String]()
var arrU = [String]()
var arrT = [String]()
var arrR = [String]()
var arrW = [String]()
var arrQ = [String]()
var arrS = [String]()
var poparr = [String]()
var filteredTableData = [String]()
var resultSearchController = UISearchController()
let collation = UILocalizedIndexedCollation.currentCollation()
as! UILocalizedIndexedCollation
override func viewDidLoad() {
super.viewDidLoad()
var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)
distinctstring.append("POPULAR FoodS")
var context: NSManagedObjectContext = appDel.managedObjectContext!
var request = NSFetchRequest(entityName: "Food")
var request1 = NSFetchRequest(entityName: "Food")
if var resultsFood = context.executeFetchRequest(request, error: nil) as? [Food]
{
//println("\n Food Results in Table view : \(resultsFood)")
for resultsb in resultsFood
{
if (resultsFood.count > 0)
{
println("\(resultsb.Food_name) : \(resultsb.popularity) ")
if (resultsFood.count > 0)
{
var firstchar = resultsb.Food_name.substringToIndex(resultsb.Food_name.startIndex.successor())
distinctstring.append(firstchar)
println("firstchar : \(firstchar)")
switch firstchar {
case "A" :
arrA.append(resultsb.Food_name)
case "B" :
arrB.append(resultsb.Food_name)
case "C" :
arrC.append(resultsb.Food_name)
case "D" :
arrD.append(resultsb.Food_name)
case "E" :
arrE.append(resultsb.Food_name)
case "F" :
arrF.append(resultsb.Food_name)
case "G" :
arrG.append(resultsb.Food_name)
case "H" :
arrH.append(resultsb.Food_name)
case "I" :
arrI.append(resultsb.Food_name)
case "J" :
arrJ.append(resultsb.Food_name)
case "K" :
arrK.append(resultsb.Food_name)
case "L" :
arrL.append(resultsb.Food_name)
case "M" :
arrM.append(resultsb.Food_name)
case "N" :
arrN.append(resultsb.Food_name)
case "O" :
arrO.append(resultsb.Food_name)
case "P" :
arrP.append(resultsb.Food_name)
case "Q" :
arrQ.append(resultsb.Food_name)
case "R" :
arrR.append(resultsb.Food_name)
case "S" :
arrS.append(resultsb.Food_name)
case "T" :
arrT.append(resultsb.Food_name)
case "U" :
arrU.append(resultsb.Food_name)
case "V" :
arrV.append(resultsb.Food_name)
case "W" :
arrW.append(resultsb.Food_name)
case "X" :
arrX.append(resultsb.Food_name)
case "Y" :
arrY.append(resultsb.Food_name)
case "Z" :
arrZ.append(resultsb.Food_name)
default:
println("No present")
}
arr.append(resultsb.Food_name)
}
}
else
{
println("No rows found")
}
}
println("array A = \(arrA)")
println("array B = \(arrB)")
println("array C = \(arrC)")
println("array D = \(arrD)")
println("array E = \(arrE)")
println("array F = \(arrF)")
println("array G = \(arrG)")
println("array H = \(arrH)")
println("array I = \(arrI)")
println("array J = \(arrJ)")
println("array K = \(arrK)")
println("array L = \(arrL)")
println("array M = \(arrM)")
println("array N = \(arrN)")
println("array O = \(arrO)")
println("array P = \(arrP)")
println("array Q = \(arrQ)")
println("array R = \(arrR)")
println("array S = \(arrS)")
println("array T = \(arrT)")
println("array U = \(arrU)")
println("array V = \(arrV)")
println("array W = \(arrW)")
println("array X = \(arrX)")
println("array Y = \(arrY)")
println("array Z = \(arrZ)")
distinctstring = uniq(distinctstring)
}
if var resultsFood1 = context.executeFetchRequest(request1, error: nil) as? [Food]
{
//println("\n Food Results in Table view : \(resultsFood)")
for resultsb in resultsFood1
{
if (resultsFood1.count > 0)
{
//println("\n Table view Results ")
//println("Value of Foodname Array : \(resultsb)")
if (resultsFood1.count > 0)
{
if (resultsb.popularity == 1)
{ println("Value of pop Foodname Array \(resultsb.Food_name) : \(resultsb.popularity) ")
poparr.append(resultsb.Food_name)
}
}
}
else
{
println("No rows found")
}
}
println("poparr = \(poparr)")
}
self.Foodtable.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
Foodtable.dataSource = self
Foodtable.delegate = self
//searchBar.delegate = self
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.sizeToFit()
controller.searchBar.placeholder = "Search by Food name"
self.Foodtable.tableHeaderView = controller.searchBar
return controller
})()
// Reload the table
self.Foodtable.reloadData()
// Do any additional setup after loading the view.
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// 2
if (self.resultSearchController.active) {
return self.filteredTableData.count
}
else {
switch distinctstring[section]
{
case "POPULAR FOOD" :
return self.poparr.count
case "A" :
return self.arrA.count
case "B" :
return self.arrB.count
case "C" :
return self.arrC.count
case "D" :
return self.arrD.count
case "E" :
return self.arrE.count
case "F" :
return self.arrF.count
case "G" :
return self.arrG.count
case "H" :
return self.arrH.count
case "I" :
return self.arrI.count
case "J" :
return self.arrJ.count
case "K" :
return self.arrK.count
case "L" :
return self.arrL.count
case "M" :
return self.arrM.count
case "N" :
return self.arrN.count
case "O" :
return self.arrO.count
case "P" :
return self.arrP.count
case "Q" :
return self.arrQ.count
case "R" :
return self.arrR.count
case "S" :
return self.arrS.count
case "T" :
return self.arrT.count
case "U" :
return self.arrU.count
case "V" :
return self.arrV.count
case "W" :
return self.arrW.count
case "X" :
return self.arrX.count
case "Y" :
return self.arrY.count
case "Z" :
return self.arrZ.count
default:
return self.arr.count
}
}
}
func uniq<S: SequenceType, E: Hashable where E==S.Generator.Element>(source: S) -> [E] {
var seen: [E:Bool] = [:]
return filter(source) { seen.updateValue(true, forKey: $0) == nil }
}
///////////////////////////////////////Section
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return (distinctstring.count)
}
///////////////////////////////////////Section
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
tableView.deselectRowAtIndexPath(indexPath, animated: true)
var dishes = ""
if (self.resultSearchController.active) {
dishes = filteredTableData[indexPath.row]
}
else {
println("distinctLetters : \(distinctstring[indexPath.section])")
switch (distinctstring[indexPath.section]) {
case "POPULAR FOOD" :
dishes = poparr[indexPath.row]
case "A" :
dishes = arrA[indexPath.row]
case "B":
dishes = arrB[indexPath.row]
case "C":
dishes = arrC[indexPath.row]
case "D" :
dishes = arrD[indexPath.row]
case "E":
dishes = arrE[indexPath.row]
case "F":
dishes = arrF[indexPath.row]
case "G" :
dishes = arrG[indexPath.row]
case "H":
dishes = arrH[indexPath.row]
case "I":
dishes = arrI[indexPath.row]
case "J" :
dishes = arrJ[indexPath.row]
case "K":
dishes = arrK[indexPath.row]
case "L":
dishes = arrL[indexPath.row]
case "M" :
dishes = arrM[indexPath.row]
case "N":
dishes = arrN[indexPath.row]
case "O":
dishes = arrO[indexPath.row]
case "P" :
dishes = arrP[indexPath.row]
case "Q":
dishes = arrQ[indexPath.row]
case "R":
dishes = arrR[indexPath.row]
case "S" :
dishes = arrS[indexPath.row]
case "T":
dishes = arrT[indexPath.row]
case "U":
dishes = arrU[indexPath.row]
case "V" :
dishes = arrV[indexPath.row]
case "W":
dishes = arrW[indexPath.row]
case "X":
dishes = arrX[indexPath.row]
case "Y" :
dishes = arrY[indexPath.row]
case "Z":
dishes = arrZ[indexPath.row]
//return sectionHeaderView
default:
dishes = arr[indexPath.row]
}
}
println("row selected : \(dishes)")
}
func tableView(tableView: UITableView,titleForHeaderInSection section: Int) -> String?{
if (self.resultSearchController.active) {
return ""
}
else {
return "\(distinctstring[section])"
}
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! UITableViewCell;
cell.textLabel!.font = UIFont(name: "Gotham", size: 13)
//println("distinctLetters in cell : \(distinctLetters[indexPath.section]) ")
cell.textLabel!.numberOfLines = 2;
if (self.resultSearchController.active) {
cell.textLabel?.text = filteredTableData[indexPath.row]
return cell
}
else {
switch (distinctstring[indexPath.section]) {
case "POPULAR FOOD" :
cell.textLabel?.text = poparr[indexPath.row]
case "A" :
cell.textLabel?.text = arrA[indexPath.row]
case "B":
cell.textLabel?.text = arrB[indexPath.row]
case "C":
cell.textLabel?.text = arrC[indexPath.row]
case "D" :
cell.textLabel?.text = arrD[indexPath.row]
case "E":
cell.textLabel?.text = arrE[indexPath.row]
case "F":
cell.textLabel?.text = arrF[indexPath.row]
case "G" :
cell.textLabel?.text = arrG[indexPath.row]
case "H":
cell.textLabel?.text = arrH[indexPath.row]
case "I":
cell.textLabel?.text = arrI[indexPath.row]
case "J" :
cell.textLabel?.text = arrJ[indexPath.row]
case "K":
cell.textLabel?.text = arrK[indexPath.row]
case "L":
cell.textLabel?.text = arrL[indexPath.row]
case "M" :
cell.textLabel?.text = arrM[indexPath.row]
case "N":
cell.textLabel?.text = arrN[indexPath.row]
case "O":
cell.textLabel?.text = arrO[indexPath.row]
case "P" :
cell.textLabel?.text = arrP[indexPath.row]
case "Q":
cell.textLabel?.text = arrQ[indexPath.row]
case "R":
cell.textLabel?.text = arrR[indexPath.row]
case "S" :
cell.textLabel?.text = arrS[indexPath.row]
case "T":
cell.textLabel?.text = arrT[indexPath.row]
case "U":
cell.textLabel?.text = arrU[indexPath.row]
case "V" :
cell.textLabel?.text = arrV[indexPath.row]
case "W":
cell.textLabel?.text = arrW[indexPath.row]
case "X":
cell.textLabel?.text = arrX[indexPath.row]
case "Y" :
cell.textLabel?.text = arrY[indexPath.row]
case "Z":
cell.textLabel?.text = arrZ[indexPath.row]
//return sectionHeaderView
default:
cell.textLabel?.text = arr[indexPath.row]
}
return cell
}Food
//return cell;
}
func updateSearchResultsForSearchController(searchController: UISearchController)
{
filteredTableData.removeAll(keepCapacity: false)
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text)
let array = (arr as NSArray).filteredArrayUsingPredicate(searchPredicate)
filteredTableData = array as! [String]
self.Foodtable.reloadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func prefersStatusBarHidden() -> Bool {
return true
}
}
答案 1 :(得分:0)
我建议重建你的Dishes
数组,如下所示:
var Dishes = [["title":"POPULAR Dishes", "data":["Biryani", "Tandori Chicken","Butter Chicken", "Vada Pav"]], ["title":"A", "data":["Aloo baingan", "Aloo ki Tikki", "Amritsari fish"]], ["title":"B", "data":["Baigan bharta", "Biryani"]]]
并改变这样:
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
println("Dishes section count : \(section)")
if let sectionData = Dishes[section] as? [String:AnyObject] {
if let dataArray = sectionData["data"] as? [String] {
return dataArray.count
}
}
return 0
}