iOS
UISearchController
수색…
통사론
- UISearchController (searchResultsController : UIViewController?) // 검색 업데이트 컨트롤러가 검색 가능한 내용을 표시하는 경우 매개 변수로 nil을 전달합니다.
- func updateSearchResults (searchController : UISearchController) // UISearchResultsUpdating 프로토콜을 채택 할 때 구현할 필수 메소드
매개 변수
매개 변수 | 세부 |
---|---|
UISearchController.searchBar | 인터페이스에 설치할 검색 창. (읽기 전용) |
UISearchController.searchResultsUpdater | 검색 결과 컨트롤러의 내용을 업데이트하는 객체입니다. |
UISearchController.isActive | 검색 인터페이스의 제시된 상태. |
UISearchController.obscuresBackgroundDuringPresentation | 검색 중에 기본 내용이 가려져 있는지 여부를 나타내는 부울입니다. |
UISearchController.dimsBackgroundDuringPresentation | 검색 중에 기본 내용이 흐리게 표시되는지 여부를 나타내는 부울입니다. |
UISearchController.hidesNavigationBarDuringPresentation | 검색시 탐색 막대를 숨겨야하는지 여부를 나타내는 부울입니다. |
UIViewController.definesPresentationContext | View Controller 또는 View Controller의 자손 중 하나가 View Controller를 표시 할 때이 View Controller의보기가 적용되는지 여부를 나타내는 부울 값입니다. |
UIViewController.navigationItem.titleView | 수신기가 검색 창을 배치 할 수있는 최상위 항목 일 때 탐색 모음의 가운데에 표시되는 사용자 정의보기입니다. |
UITableViewController.tableView.tableHeaderView | 검색 막대를 배치 할 수있는 테이블 위에 표시되는 액세서리보기를 반환합니다. |
비고
탐색 모음 제목의 검색 모음
이 예제에서는 검색 컨트롤러를 사용하여 테이블 뷰 컨트롤러 내부의 데이터를 필터링합니다. 검색 막대는 표보기가 포함 된 탐색 막대 안에 있습니다.
UINavigationController
에 UITableViewController
를 포함하여 UINavigationItem
(탐색 모음 포함)을 가져옵니다. 그런 다음 사용자 정의 ViewController 클래스를 설정하여 UITableViewController
에서 상속 받고 UISearchResultsUpdating
프로토콜을 채택하십시오.
class ViewController: UITableViewController, UISearchResultsUpdating {
let entries = [(title: "Easiest", image: "green_circle"),
(title: "Intermediate", image: "blue_square"),
(title: "Advanced", image: "black_diamond"),
(title: "Expert Only", image: "double_black_diamond")]
// An empty tuple that will be updated with search results.
var searchResults : [(title: String, image: String)] = []
let searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
self.definesPresentationContext = true
// Place the search bar in the navigation item's title view.
self.navigationItem.titleView = searchController.searchBar
// Don't hide the navigation bar because the search bar is in it.
searchController.hidesNavigationBarDuringPresentation = false
}
func filterContent(for searchText: String) {
// Update the searchResults array with matches
// in our entries based on the title value.
searchResults = entries.filter({ (title: String, image: String) -> Bool in
let match = title.range(of: searchText, options: .caseInsensitive)
// Return the tuple if the range contains a match.
return match != nil
})
}
// MARK: - UISearchResultsUpdating method
func updateSearchResults(for searchController: UISearchController) {
// If the search bar contains text, filter our data with the string
if let searchText = searchController.searchBar.text {
filterContent(for: searchText)
// Reload the table view with the search result data.
tableView.reloadData()
}
}
// MARK: - UITableViewController methods
override func numberOfSections(in tableView: UITableView) -> Int { return 1 }
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// If the search bar is active, use the searchResults data.
return searchController.isActive ? searchResults.count : entries.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// If the search bar is active, use the searchResults data.
let entry = searchController.isActive ?
searchResults[indexPath.row] : entries[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = entry.title
cell.imageView?.image = UIImage(named: entry.image)
return cell
}
}
표보기 헤더의 검색 창
이 예제에서는 검색 컨트롤러를 사용하여 테이블 뷰 컨트롤러의 셀을 필터링합니다. 검색 막대는 표보기의 머리글보기 안에 있습니다. 표보기 내용은 검색 막대와 동일한 높이로 오프셋되어 있으므로 검색 막대가 처음에는 숨겨집니다. 테이블보기의 상단 가장자리를지나 위로 스크롤하면 검색 막대가 나타납니다. 그런 다음 검색 막대가 활성화되면 탐색 막대가 숨겨집니다.
UINavigationController에 UITableViewController를 포함하여 UINavigationItem (탐색 모음 포함)을 가져옵니다. 그런 다음 사용자 정의 ViewController 클래스를 설정하여 UITableViewController에서 상속 받고 UISearchResultsUpdating 프로토콜을 채택하십시오.
class ViewController: UITableViewController, UISearchResultsUpdating {
let entries = [(title: "Easiest", image: "green_circle"),
(title: "Intermediate", image: "blue_square"),
(title: "Advanced", image: "black_diamond"),
(title: "Expert Only", image: "double_black_diamond")]
// An empty tuple that will be updated with search results.
var searchResults : [(title: String, image: String)] = []
let searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
self.definesPresentationContext = true
// Place the search bar in the table view's header.
self.tableView.tableHeaderView = searchController.searchBar
// Set the content offset to the height of the search bar's height
// to hide it when the view is first presented.
self.tableView.contentOffset = CGPoint(x: 0, y: searchController.searchBar.frame.height)
}
func filterContent(for searchText: String) {
// Update the searchResults array with matches
// in our entries based on the title value.
searchResults = entries.filter({ (title: String, image: String) -> Bool in
let match = title.range(of: searchText, options: .caseInsensitive)
// Return the tuple if the range contains a match.
return match != nil
})
}
// MARK: - UISearchResultsUpdating method
func updateSearchResults(for searchController: UISearchController) {
// If the search bar contains text, filter our data with the string
if let searchText = searchController.searchBar.text {
filterContent(for: searchText)
// Reload the table view with the search result data.
tableView.reloadData()
}
}
// MARK: - UITableViewController methods
override func numberOfSections(in tableView: UITableView) -> Int { return 1 }
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// If the search bar is active, use the searchResults data.
return searchController.isActive ? searchResults.count : entries.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// If the search bar is active, use the searchResults data.
let entry = searchController.isActive ?
searchResults[indexPath.row] : entries[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = entry.title
cell.imageView?.image = UIImage(named: entry.image)
return cell
}
}
이행
먼저 클래스가 UISearchResultsUpdating
프로토콜을 준수하도록합니다.
class MyTableViewController: UITableViewController, UISearchResultsUpdating {}
검색 컨트롤러 속성을 추가하십시오.
class MyTableViewController: UTableViewController, UISearchResultsUpdating {
let searchController = UISearchController(searchResultsController: nil)
}
검색 창 추가 :
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.sizeToFit()
self.tableView.tableHeaderView = searchController.searchBar
}
마지막으로 UISearchResultsUpdating
프로토콜에서 제공되는 updateSearchResultsForSearchController
메서드를 구현합니다.
func updateSearchResultsForSearchController(searchController: UISearchController) {
}
Objective-C의 UISerachController
Delegate: UISearchBarDelegate, UISearchControllerDelegate, UISearchBarDelegate
@property (strong, nonatomic) UISearchController *searchController;
- (void)searchBarConfiguration
{
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchBar.delegate = self;
self.searchController.hidesNavigationBarDuringPresentation = NO;
// Hides search bar initially. When the user pulls down on the list, the search bar is revealed.
[self.tableView setContentOffset:CGPointMake(0, self.searchController.searchBar.frame.size.height)];
self.searchController.searchBar.backgroundColor = [UIColor DarkBlue];
self.searchController.searchBar.tintColor = [UIColor DarkBlue];
self.tableView.contentOffset = CGPointMake(0, CGRectGetHeight(_searchController.searchBar.frame));
self.tableView.tableHeaderView = _searchController.searchBar;
_searchController.searchBar.delegate = self;
_searchController.searchBar.showsCancelButton = YES;
self.tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(resetSearchbarAndTableView)];
[self.view addGestureRecognizer:self.tapGestureRecognizer];
}
- (void)resetSearchbarAndTableView{
// Reload your tableview and resign keyboard.
}
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{
// Search cancelled
}
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
// Implement filtration of your data as per your need using NSPredicate or else.
// then reload your data control like Tableview.
}