2016-11-26 10 views
3

私はデータベースからアルファベットセクションのテーブルビューを持っていますが、検索バーを追加したいのですが、データをフィルタリングしてテーブルビューに実装する方法を理解できません。 私のデータベースストアは2つの構造体の中にあります:swift3を使用してテーブルビュー内のバーとセクションを検索

すべてのデータを保持する1つの構造体。

second structはセクションの最初の文字を取得し、最初のstructは配列として取得します。

マイ構造体:

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 
    } 
} 

私のtableView:全crimeData

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 
} 

答えて

2

まず含むデータソースアレイをフィルタリングすることから離れてString

と比較することができないSentenceNameSectionが含ま繰り返しループを使用して新規作成するSentenceNameSectionアイテム

この

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)) 
    } 
} 

SentenceInfo構造体のすべての3つのプロパティのコード検索は注:もちろんあなたはすべての適切なテーブルビューのデータソースとデリゲートメソッドでsearchケースを処理する必要があります。

+0

ありがとうございました。なぜそれをテーブルビューに実装しようとするとエラーが発生するのですか(「致命的なエラー:インデックスが範囲外です」): –

+0

( 'filteredCrime:SentenceInfo = filteredData [indexPath.section] .crimes [indexPath.row]') * Note *で述べたように、検索コントローラのisActiveに応じて、適切な値が 'numberOfSections'と' numberOfRows'から返されるようにしてください。 – vadian

+0

あなたはそれに気付かなかった。うまく働いた。大変ありがとうございました –

0
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 
     } 
関連する問題