使用swift3在tableview中搜索栏和部分
Posted
技术标签:
【中文标题】使用swift3在tableview中搜索栏和部分【英文标题】:Search bar and sections in tableview using swift3 【发布时间】:2016-11-26 10:53:00 【问题描述】:我的数据库中有带有字母部分的 tableview,我想添加搜索栏,但我不知道如何过滤数据并在 tableview 中实现它。 我的数据库存储在两个结构中:
一个包含所有数据的结构。
第二个结构获取节的第一个字母,第一个结构作为数组。
我的结构:
struct SentenceInfo // First struct (holds all the data)
let name: String
let detail: String
let sentence: String
init(name: String, detail: String, sentence: String)
self.name = name
self.detail = detail
self.sentence = sentence
struct SentenceNameSection // Second struct (first letter and array of the first struct)
var firstLetter: String
var crimes: [SentenceInfo]
init(title: String, objects: [SentenceInfo])
firstLetter = title
crimes = objects
我的表格视图:
var sections : [SentenceNameSection]!
var crimeData = [SentenceNameSection]()
var filteredData = [SentenceNameSection]()
var shouldShowSearchResults = false
var searchController: UISearchController!
func updateSearchResults(for searchController: UISearchController)
let searchString = searchController.searchBar.text
filteredData = crimeData.filter( (crime) -> Bool in
let crimeMatch: String = crime // Error about types
return ((crimeMatch.range(of: searchString!) != nil))
)
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell: sentenceTableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifer, for: indexPath) as! sentenceTableViewCell
let crime: SentenceInfo = sections[indexPath.section].crimes[indexPath.row]
cell.nameLabel.text = crime.name
cell.detailLabel.text = crime.detail
cell.sentenceLabel.text = crime.sentence
return cell
【问题讨论】:
【参考方案1】:首先crimeData
包含不能与String
比较的SentenceNameSection
除此之外,要过滤包括部分的数据源数组,您必须使用重复循环并创建新的SentenceNameSection
项目
此代码搜索SentenceInfo
结构中的所有三个属性
let searchString = searchController.searchBar.text!
filteredData.removeAll() // is mandatory to empty the filtered array
for section in crimeData
let filteredContent = section.crimes.filter $0.name.range(of: searchString) != nil
|| $0.detail.range(of: searchString) != nil
|| $0.sentence.range(of: searchString) != nil
if !filteredContent.isEmpty
filteredData.append(SentenceNameSection(title: section.firstLetter, objects: filteredContent))
注意:当然,您必须在所有适当的表视图数据源和委托方法中处理search
情况。
【讨论】:
谢谢你成功了。为什么当我尝试将它实现到表视图时出现错误(“致命错误:索引超出范围”)代码:('let filteredCrime:SentenceInfo = filteredData[indexPath.section].crimes[indexPath.row]') 确保从numberOfSections
和numberOfRows
返回正确的值,具体取决于注意 中提到的搜索控制器的isActive
。
你没注意到。工作得很好。谢谢你的帮助【参考方案2】:
For Swift 3 , below is the sample code
Struct BookDetails
var title:String?
var author:String?
var filteredSearch:[BookDetails] = []
filteredSearch = self.bookDetails.filter (data) -> Bool in
return data.title?.range(of: searchText, options: String.CompareOptions.caseInsensitive) != nil || data.author?.range(of: searchText, options: String.CompareOptions.caseInsensitive) != nil
【讨论】:
以上是关于使用swift3在tableview中搜索栏和部分的主要内容,如果未能解决你的问题,请参考以下文章
视图控制器中的搜索栏和搜索显示控制器,其中包含 UITableView
我想在 swift3 的 tableview 中插入行作为部分