UISearchController、SearchBarチュートリアル-Swift
Uisearchcontroller Searchbar Tutorial Swift
アプリケーションに大量のデータを表示する場合、大規模なリストのスクロールが遅くなり、イライラする可能性があります。この場合、UISearchController、UISearchBarにクエリを実行することは非常に重要であり、ユーザーは注目のアイテムを検索できます。幸い、UIKitにはUISearchBarが含まれており、UITableViewを完全に統合しています。このUISearchControllerチュートリアルでは、検索可能なキャンディーアプリeを作成します。このアプリは、標準のビューテーブルに基づいています。 UISearchControllerを活用しながら、動的フィルタリングを含むsearchBarを追加し、オプションの検索スコープを追加します。最後に、アプリケーションをよりユーザーフレンドリーにする方法を学びます。
キャンディーの結果を検索する準備はできましたか? ?
始める準備ができました!
最初に「開始プロジェクト」をダウンロードします ここに '、次にこのアプリを開きます。このアプリは、ナビゲーションコントローラーと特定のスタイルを使用して私がセットアップしたものです。プログラムを実行すると、空のリストが表示されます。
Xcodeに戻り、Candyをファイルします。 迅速 表示しようとしているキャンディーに関するすべての情報を格納するクラスが含まれています。このクラスには、カテゴリとキャンディー名の2つのプロパティがあります。
ユーザーがアプリでキャンディーを探すときは、キャンディーの名前属性をユーザーが検索する文字列と一致させる必要があります。
テーブルビューを埋める
MasterViewController.swiftを開きます。キャンディープロパティは、さまざまなスイーツをすべて管理する場所になります。それに関しては、キャンディーを作る時が来ました!
このチュートリアルでは、検索バーがどのように機能するかを説明するために、いくつかの値を作成する必要があります。アプリには、これらの検索可能なオブジェクトが何千もある場合があります。しかし、アプリケーションには何千ものオブジェクト検索がありますか?実際、方法は同じであり、スケーラビリティは最高です。
キャンディー配列を埋めるには、次のコードをviewDidLoad()に追加してから、super.viewDidLoad()を呼び出します。
candies = [ Candy(category:'Chocolate', name:'Chocolate Bar'), Candy(category:'Chocolate', name:'Chocolate Chip'), Candy(category:'Chocolate', name:'Dark Chocolate'), Candy(category:'Hard', name:'Lollipop'), Candy(category:'Hard', name:'Candy Cane'), Candy(category:'Hard', name:'Jaw Breaker'), Candy(category:'Other', name:'Caramel'), Candy(category:'Other', name:'Sour Chew'), Candy(category:'Other', name:'Gummi Bear') ] |
プロジェクトを実行します。テーブルビューのプロキシメソッドとデータソースメソッドが実装されているため、作業ビューテーブルが既に存在することがわかります。
テーブルの行の1つを選択すると、詳細ビューが表示されます。
キャンディーがたくさんあるので、こんなに短い時間で欲しいものを見つけたら、UISearchBarが必要です。
UISearchControllerの概要
UISearchBarのドキュメントを見ると、開発者が怠け者であることがわかります。検索作業は行いません。このクラスは、標準のインターフェイス、つまりユーザーを提供するだけです。 ios アプリで期待通り。
UISearchControllerとプロキシプロトコルは、他のアプリケーションにユーザーが何をしたかを知らせます。自分に合うようにすべての文字列を書く必要があります。
これは少し怖いかもしれませんが、カスタム検索機能の作成はアプリで厳密に制御されています。 iOS検索ビューテーブルを使用したことがある場合は、UISearchDisplayControllerに精通している必要があります。 IOS 8以降、このタイプのUISearchControllerは非推奨になり、使用されなくなりました。これにより、検索プロセス全体が簡素化されますが、InterfaceBuilderはテキストの書き込み時にUISearchControllerをサポートしません。 、したがって、プログラムでUIを作成する必要があります。
MasterViewController.swiftで、新しいプロパティを追加します。
let searchController = UISearchController(searchResultsController: nil) |
UISearchControllerを初期化することにより、必要な検索コントローラーを指定すると、検索結果に同じビューが表示されます。別のビューマネージャを指定すると、そのビューマネージャが結果の表示に使用されます。
次に、searchControllerのいくつかのパラメーターを設定する必要があります。まだMasterViewController.swiftで、次のコードをviewDidLoad()に追加します。
searchController.searchResultsUpdater = self searchController.dimsBackgroundDuringPresentation = false definesPresentationContext = true tableView.tableHeaderView = searchController.searchBar |
書かれた4行のコードを解析してみましょう。
1. searchResultsUpdaterは、UISearchResultsUpdatingプロトコルに準拠するUISearchControllerのプロパティです。このプロトコルを使用すると、UISearchBarのテキストが変更されたときにクラスに通知できます。あなたは短期間でこの協定を遵守する必要があります。
2.デフォルトでは、UISearchControllerはビューを暗い色調でレンダリングします。これは非常に便利ですが、searchResultsControllerを実行するために別のView Controllerを使用している場合、この場合、結果を表示するように現在のビューを設定するため、ダークトーンのビューは必要ありません。
3. definePresentationContextをtrueに設定することにより、ユーザーが別のViewControllerに移動したときにsearchBarが常に画面に表示されるとは限らないようにします。
4.最後に、テーブルビューのtableHeaderViewにsearchBarを追加しました。このインターフェースはまだUISearchControllerと互換性がないため、これを行う必要があることに注意してください。
UISearchの結果を更新およびフィルタリングします。
検索コントローラーを設定したら、それを機能させるためにいくつかのコードを記述する必要があります。まず、MasterViewControllerの上部にプロパティを追加します。
var filteredCandies = [Candy]() |
このプロパティは、ユーザーがキャンディーを検索したいものです。次に、MasterViewControllerクラスに次のメソッドを追加します。
func filterContentForSearchText(searchText: String, scope: String = 'All') { filteredCandies = candies.filter { candy in return candy.name.lowercaseString.containsString(searchText.lowercaseString) } tableView.reloadData() } |
フィルタリングされたキャンディーの配列はsearchTextに基づいて作成され、結果はfilteredCandiesの配列に配置されます。ここで範囲パラメータについて心配する必要はありません。この章の最後の部分で使用します。
MasterViewControllerがsearchBarに応答できるようにするには、UISearchResultsUpdateingを実装する必要があります。 MasterViewController.swiftを開き、MasterViewControllerクラスの外に次の拡張クラスを追加します。
extension MasterViewController: UISearchResultsUpdating { func updateSearchResultsForSearchController(searchController: UISearchController) { filterContentForSearchText(searchController.searchBar.text!) } }
このupdateSearchResultForSeachController(_ :)メソッドは、UISearchResultsUpdatingプロトコルに従う唯一の方法です。
これで、ユーザーが検索バーのテキストを追加または削除するときに、UISearchControllerはMasterViewControllerクラスに通知します。このメソッド自体は、helpメソッドの呼び出しです。 Filter()はクロージャーを取ります(キャンディー:キャンディー)->ブール値。次に、すべての要素の配列をループして、現在の各要素を渡します。
これを使用して、検索結果でキャンディーをユーザーに表示するかどうかを決定できます。これを判別するには、現在のキャンディーが配列に含まれている場合はtrueを返す必要があります。そうでない場合は、falseを返します。
containsString(_ :)は、searchTextを含むすべてのキャンディーの名前を確認するために使用されます。 lowercaseStringメソッドを使用して、2つの文字列を小文字に変換できます。
プロジェクトを実行します。グラフの上部にSearchBar検索バーがあることがわかります。
ただし、テキストを入力しても、結果や変更は表示されません。これは、まだコードを記述していないためです。グラフビューは、フィルタリングされた結果を使用していることを認識していません。
tableView(_:numberOfRowsInSection :)の代わりにMasterViewController.swiftに戻ります。
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if searchController.active && searchController.searchBar.text != '' { return filteredCandies.count } return candies.count } |
実際、大きな変更はありません。ユーザーがクエリを実行しているかどうかを確認し、フィルタリングされた通常のキャンディーをテーブルのデータソースとして使用できます。
次に、tableView(_:cellForRowAtIndexPath :)の代わりに:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier('Cell', forIndexPath: indexPath) let candy: Candy if searchController.active && searchController.searchBar.text != '' { candy = filteredCandies[indexPath.row] } else { candy = candies[indexPath.row] } cell.textLabel?.text = candy.name cell.detailTextLabel?.text = candy.category return cell } |
これら2つのメソッドのアクティブな属性は、searchControllerを参照して、表示する配列を決定します。ユーザーが検索ボックスの検索バーをクリックすると、activeが自動的にtrueに設定されます。
検索コントローラーがアクティブな場合、ユーザーが検索ボックスにコンテンツを入力したかどうかを確認できます。存在する場合、返されるデータはfilteredCandies配列から供給されます。それ以外の場合、データはプロジェクトの完全なリストから取得されます。
前後に考えてみましょう。検索結果はコントローラーを自動的に表示および非表示にするため、コントローラーの状態に応じて正しいデータを提供し、ユーザーが何かを検索したかどうかを判断するだけです。
プロジェクトを実行すると、機能的な検索バーが表示されます。
転載:https://www.cnblogs.com/ming1025/p/6118894.html