大佬教程收集整理的这篇文章主要介绍了swift UI专项训练37 实时显示搜索结果的搜索框SearchBar,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
今天我们来讲点高级点的知识,在搜索框中输入关键字,下方的tableView自动匹配包含关键字的结果。用我最近在做的一款美食类APP为例。
在storyboard中拖入一张表,然后与Vc中的代码关联起来:
@IBOutlet weak var tableView: UITableView!
var caipins = CaipinArray().caipinArray var searchResults = [caipin]()
import UIKit class caipin: NSObject { var name:string = "" var rest:string = "" var price:Float = 0 var score:Float = 0 var image:string = "" var collected:Bool = false var taste:string = "" var nutrition:string = "" init(name:string,rest:string,price:Float,score:Float,image:string,collected:Bool,taste:string,nutrition:string){ self.name = name self.rest = rest self.price = price self.score = score self.image = image self.collected = collected self.taste = taste self.nutrition = nutrition } }
CaipinArray是一个赋值过的菜品类,就不演示代码了,然后我们让vc继承tableview的datasource和delegate,实现这两个类的基本方法,本话重点不在这里就不演示了。
var searchController:UISearchController!
self.tableView.tableFooterView = UIView(frame: CGRectZero) searchController = UISearchController(searchResultsController: nil) searchController.searchBar.sizeToFit() self.view.addSubview(searchController.searchBar) tableView.tableHeaderView = searchController.searchBar definesPresentationContext = true为了清楚我提前在tableview中加入了一些数据。现在运行看看,是不是tableview的顶端出现了搜索框:
func filterContentForSearchText(searchText: String) { searchResults = caipins.filter({ ( caipin: caipin) -> Bool in let nameMatch = caipin.name.rangeOfString(searchText,options: NSStringCompareOptions.CaseInsensitiveSearch) let LOCATIOnMatch = caipin.rest.rangeOfString(searchText,options: NSStringCompareOptions.CaseInsensitiveSearch) return nameMatch != nil || LOCATIOnMatch != nil })IOS中给我们封装好了一个filter(过滤),我们可以在已经存在的数组中直接用,只需要在闭包中提供这个过滤的规则,以上的代码我们定义了两个规则,一个是匹配菜品名字或者匹配菜品所属的餐馆名称,返回的结果是一个布尔类型,通知程序有没有匹配的项。现在我们已经对输入的搜索关键字进行了判断,那么我们如何根据判断结果来更新列表中的值呢?
首先要做的一点就是集成一个UISearchResultsupdating的接口:
class SecondViewController: UIViewController,UITableViewDatasource,UISearchResultsupdating
func updateSearchResultsForSearchController(searchController: UISearchController) { let searchText = searchController.searchBar.text filterContentForSearchText(searchText) tableView.reloadData() }
func tableView(tableView: UITableView,numberOfRowsInSection section: int) -> Int { return searchResults.count }
func tableView(tableView: UITableView,cellForRowATindexPath indexPath: NSIndexPath) -> UITableViewCell { let identiString = "sCell" //代码复用 let cell = tableView.dequeueReusableCellWithIdentifier(identiString,forIndexPath: indexPath) as searchTableViewCell var caipin = caipins[indexPath.row] if searchResults.count != 0 { println(searchResults.count) caipin = searchResults[indexPath.row] } cell.nameLabel.text = caipin.name cell.scoreLabel.text = "评分:" + "\(caipin.score)" cell.restLabel.text = "餐馆:" + caipin.rest cell.priceLabel.text = "价格:" + "\(caipin.pricE)" cell.caipinImageView.image = UIImage(named: caipin.imagE) if caipin.collected == true { cell.shoucangImageView.image = UIImage(named: "heart_fill_28") } return cell }@R_77_6607@搜索到的话我们的结果集是空的,如果直接返回给caipin的话会显示空值。这是因为Swift中向一个空数组中插值只能用append或者+-,直接使用空数组中的元素会报 Cannot index empty buffer 这个错误,所以思考再三我增加了一个判断语句,如果搜索结果集中没有元素,那么返回所有元素的集合,因为tableview的行数被我们定义成搜索结果集的元素个数,所以此时表中依旧不显示元素。当搜索结果集中有值的时候,我们可以放心的使用它当中的元素和属性。
最后一步,我们需要给viewDidLoad方法加入以下代码:
searchController.searchResultsupdater = self searchController.dimsBACkgroundDuringPresentation = false
searchController.searchBar.placeholder = "请输入菜品或餐馆"
快来运行看看效果吧。
回到搜索界面发现列表中已经没有东西了,在搜索框中输入一个“芳”:
可以看到菜品中和餐馆中包含“芳”字的结果都显示了出来!这就是swift的强大之处,只是用了很简单的代码就实现了这么好用的功能,快来试试吧。
以上是大佬教程为你收集整理的swift UI专项训练37 实时显示搜索结果的搜索框SearchBar全部内容,希望文章能够帮你解决swift UI专项训练37 实时显示搜索结果的搜索框SearchBar所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。