2017-09-13 9 views
0

現在の検索バーがあり、検索テキストが配列内の項目と一致しないときにテーブルをクリアするだけでよい空の検索バー)。検索バーのフィルタで結果が一致しないときにテーブルが消去されない

また、一致するものが見つからない場合(「結果が利用できません」など)、セルの1つにメッセージが表示されます。私は、これは検索バーの機能を作成するための最良の方法ではありません知っている

@IBOutlet var searchForTool: UISearchBar! 
@IBOutlet var toolTable: UITableView! 

var searchActive : Bool = false 
    { 
    didSet { 
     if searchActive != oldValue { 
      toolTable?.reloadData() 
     } 
    } 
} 

typealias Item = (data: String, identity: String) 

var filtered: [Item] = [] 
var items: [Item] = [ 
    (data: " Data1", identity: "A"), (data: " Data2", identity: "B") 
] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.navigationController?.setNavigationBarHidden(true, animated: false) 

    AppState.shared.category = "Alphabetical" 

} 

@IBAction func backButton(_ sender: Any) { 

    if let navController = self.navigationController { 
     for controller in navController.viewControllers { 
      if controller is ToolsViewController { 
       navController.popToViewController(controller, animated: true) 
      } 
     } 
    } 
} 

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 

    filtered = items.filter { item in 
     item.data.localizedCaseInsensitiveContains(searchText) 
    } 

    searchActive = !filtered.isEmpty 

    self.toolTable.reloadData() 

} 

func numberOfSections(in tableView: UITableView) -> Int { 

    return 1 
} 

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

    if(searchActive) { 
     return filtered.count 
    } 

    return items.count 

} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell 

    cell.alphabeticalLabel.layer.masksToBounds = true 

    if(searchActive) { 
     cell.alphabeticalLabel.text = filtered[indexPath.row].data 
     cell.alphabeticalLabel.layer.cornerRadius = 10 
    } else { 
     cell.alphabeticalLabel.text = items[indexPath.row].data 
     cell.alphabeticalLabel.layer.cornerRadius = 10 
    } 

    return cell 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    let vcName: String 
    if searchActive { 
     vcName = filtered[indexPath.row].identity 
    } else { 
     vcName = items[indexPath.row].identity 
    } 
    let viewController = storyboard?.instantiateViewController(withIdentifier: vcName) 
    self.navigationController?.pushViewController(viewController!, animated: true) 
} 
} 

が、これは、私はしばらくの間で作業していたものです:

は、ここに私のコードです。私は解決策がそれほど複雑ではないと確信していますが、私はそれに幸運を祈ることはありません。

ご協力いただければ幸いです。お返事に基づいて

+0

残りのロジックは期待通りに機能していると思います。 'items.count'ではなく'!searchActive'なら 'numberOfRowsInSection'で0を返さないのはなぜですか? または1を返してから 'cellForRowAtIndexPath'でセルの' alphabeticalLabel'を「結果が見つかりません」に設定しますか? – leandrodemarco

+0

@leandrodemarco、問題は、私が何かを入力するまで、テーブルが空白であることです。テーブルが空でなければならない唯一のタイプは、検索バーに間違ったものが入力されたときです。 –

答えて

1

、検索テキストが空であるかどうかを確認するチェックを追加します。

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

    if(searchActive) { 
     return filtered.count 
    } 
    else if (searchForTool.text? == "") { // check if this is "" or nil 
     return items.count 
    } 
    else { 
     return 0 // Or 1 if you want to show a cell with "no found" text 
    } 
} 

あなたは同様にcellForRowAtIndexpathを調整する必要があります。また、検索バーのテキストプロパティがnilであるか、ユーザーが何も入力していないときに空の文字列をチェックした場合には、確認してください。

+0

はい、うまくいきます。 searchForTool.textのオプションをオフにしなければなりませんでした。それ以外の場合はエラーが発生しました。それに応じてcellForRowAtIndexpathを修正しました。ありがとう! –

関連する問題