수색…


통사론

  • 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 검색 막대를 배치 할 수있는 테이블 위에 표시되는 액세서리보기를 반환합니다.

비고

UIKit 프레임 워크 참조 :

UISearchController

UISearchResultsUpdating

탐색 모음 제목의 검색 모음

이 예제에서는 검색 컨트롤러를 사용하여 테이블 뷰 컨트롤러 내부의 데이터를 필터링합니다. 검색 막대는 표보기가 포함 된 탐색 막대 안에 있습니다.

탐색 바에서 탐색 바

UINavigationControllerUITableViewController 를 포함하여 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
    }
}

표보기 헤더의 검색 창

이 예제에서는 검색 컨트롤러를 사용하여 테이블 뷰 컨트롤러의 셀을 필터링합니다. 검색 막대는 표보기의 머리글보기 안에 있습니다. 표보기 내용은 검색 막대와 동일한 높이로 오프셋되어 있으므로 검색 막대가 처음에는 숨겨집니다. 테이블보기의 상단 가장자리를지나 위로 스크롤하면 검색 막대가 나타납니다. 그런 다음 검색 막대가 활성화되면 탐색 막대가 숨겨집니다.

search-bar-in-table-header-gif 검색 바 - 인 - 테이블 헤더

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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow