ios - 검색 - uisearchbar frame




UITableView-Swift에서 UISearchController를 구현하는 방법 (2)

누군가 나 같은 사람을 괴롭히는 사람이 있다면 ..이 코드가 도움이 될거야.

class ViewController: UIViewController , UITableViewDataSource, UITableViewDelegate,UISearchResultsUpdating {

    @IBOutlet weak var tblView: UITableView!

    var tabledata = ["lucques","chickendijon","godaddy","amazon","chris","ambata","bankofamerica","abelcine","AUTO + TRANSPORTATION","BILLS + UTILITIES","FOOD + DINING","HEALTH","AutoCare", "Auto Payment" , "Gas+Fuel","Electric Bill", "Internet/Television","Fast Foodd", "Gorceries" , "Restaurants","Gym Membership", "Health Insurance","auto","note-bullet","knife","heart"]

    var filteredTableData = [String]()
    var resultSearchController = UISearchController()

    override func viewDidLoad() {
        super.viewDidLoad()
        tblView.delegate = self
        tblView.dataSource = self
        self.resultSearchController = ({
            let controller = UISearchController(searchResultsController: nil)
            controller.searchResultsUpdater = self
            controller.dimsBackgroundDuringPresentation = false
            controller.searchBar.sizeToFit()
            controller.searchBar.barStyle = UIBarStyle.Black
            controller.searchBar.barTintColor = UIColor.whiteColor()
            controller.searchBar.backgroundColor = UIColor.clearColor()
            self.tblView.tableHeaderView = controller.searchBar
            return controller
        })()
        self.tblView.reloadData()
    }

     func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if self.resultSearchController.active {
           return self.filteredTableData.count
        }else{
            return self.tabledata.count
       }
    }
     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var section = indexPath.section
        var row = indexPath.row
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier:"addCategoryCell")
        cell.selectionStyle =  UITableViewCellSelectionStyle.None
        cell.backgroundColor = UIColor.clearColor()
        cell.contentView.backgroundColor = UIColor.clearColor()
        cell.textLabel?.textAlignment = NSTextAlignment.Left
        cell.textLabel?.textColor = UIColor.blackColor()
        cell.textLabel?.font = UIFont.systemFontOfSize(14.0)

        if self.resultSearchController.active {
              cell.textLabel?.text = filteredTableData[indexPath.row]
        } else {
                 cell.textLabel?.text = tabledata[indexPath.row]
        }
        return cell
    }

    func updateSearchResultsForSearchController(searchController: UISearchController) {
        filteredTableData.removeAll(keepCapacity: false)
        let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text)
        let array = (tabledata as NSArray).filteredArrayUsingPredicate(searchPredicate)
        filteredTableData = array as! [String]
        self.tblView.reloadData()

    }
}

나는 Swift의 초보자이며 UIViewController 클래스에있는 UITableView 검색 기능을 추가하려고합니다. 내가 많이 봤 거든 UISearchDisplayController 가 사용 중지되고 UISearchController로 대체 찾았습니다. 튜토리얼을 검색하려고 할 때, 특별히 UITableView 찾지 못했습니다. 그들 중 일부는 UITableViewController 에서 구현하기위한 것이 었습니다. 그래서 내 질문은 다음과 같습니다.

  1. UIViewController 클래스에있는 UITableView 에서 UISearchController 를 구현할 수 있습니까? (나는 우리가 할 수 있다고 생각한다)

  2. 가능한 경우 Objective-C로 작성된 이러한 코드 줄을 변환하십시오. 또는 실제로 유용한 자습서가 있다면 알려주십시오.

    @property (strong, nonatomic) UISearchController *searchController;
    
    UITableViewController *searchResultsController = [[UITableViewController alloc] init];
    
    // Init UISearchController with the search results controller
     self.searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsController];
    
    // Link the search controller
    self.searchController.searchResultsUpdater = self;
    

Source

편집 : 검색 결과로 updater를 할당하려고합니다.

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating {

    override func viewDidLoad() {

       super.viewDidLoad()
       self.view.backgroundColor = UIColor.blackColor() 
       self.addTableViewWithSection() 
       self.searchResultsController = UITableViewController()           
       var controller = UISearchController(searchResultsController: nil)            
       controller.searchResultsUpdater = self           
       controller.dimsBackgroundDuringPresentation = false   
    }
}

* 그러나 라인 컨트롤러에서 .searchResultsUpdater = self 나는 " UISearchResultsUpdating ?"유형의 값에 "ViewController"값을 할당 할 수 없습니다. .. UIViewController 유형 클래스에서 UISearchController 를 사용할 수 있는지 정말 의심 스럽습니다.


예, 검색 방식이 근본적으로 바뀌 었습니다. 더 나은 시스템으로 생각합니다. 새로운 시스템은 가장 간단한 구현의 경우 훨씬 더 낫고 곧바로 중요합니다. 그것을 사용하는 것은 매우 간단합니다.

먼저 클래스가 UISearchResultsUpdating 프로토콜을 준수하도록합니다.

class MyTableViewController: UITableViewController, UISearchResultsUpdating {}

검색 컨트롤러 속성을 추가하십시오.

class MyTableViewController: UTableViewController, UISearchResultsUpdating {
    let searchController = UISearchController(searchResultsController: nil)
}

viewDidLoad에 검색 창 추가 :

override func viewDidLoad() {
    super.viewDidLoad()

    searchController.searchResultsUpdater = self
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.dimsBackgroundDuringPresentation = false
    searchController.searchBar.sizeToFit()
    self.tableView.tableHeaderView = searchController.searchBar
}

마지막으로 UISearchResultsUpdating 프로토콜에서 제공되는 updateSearchResults:for 메서드를 구현합니다.

func updateSearchResults(for searchController: UISearchController) {

}

물론이 메소드의 구현은 데이터를 검색하는 위치에 따라 달라집니다. 입력 할 때 검색 내용으로 현재 테이블 뷰를 업데이트합니다. updateSearchResultsForSearchController 메소드에서 데이터 소스를 갱신하고 테이블 뷰를 다시로드하십시오. 다시 입력하면 업데이트되므로 검색 할 데이터가 크거나 인터넷에서 검색하는 경우이 메서드에 일부 동시성을 추가해야합니다.

다른 컨트롤러를 사용하여 검색 결과를 채우려는 경우 searchController 속성을 초기화 할 때 해당 VC를 전달할 수 있습니다.

편집 : 귀하의 질문을 다시 읽었습니다 및 뭔가 중요 한 것을 추가하는 것을 잊은 것 같습니다.

UITableViewController에는 tableView 라는 멤버가 있습니다. 컨트롤러의 테이블 뷰를 가져올 수 있지만 UITableView 를 채우려면 터치 할 필요가 없습니다. UITableView에서는 SearchController 로직을 직접 사용할 수 없습니다. 컨트롤러와 함께 작업해야합니다. UITableViewController 대리자 및 데이터 소스 메서드를 사용하여 검색 결과로 테이블 UI를 업데이트하십시오.

UITableViewController, UITableViewDelegate 및 UITableViewDataSource를 사용하여 읽으십시오. 그러면 검색 결과를 얻는 방법을 이해할 수 있습니다.





uisearchcontroller