searchController 使用出现的懵逼bug

今天在做搜索功能的时候,用到了searchController
参考了
http://blog.csdn.net/longshihua/article/details/53101094
http://www.jianshu.com/p/0b3e18f58b33
https://github.com/codepath/ios_guides/wiki/Search-Bar-Guide#example-searching-a-collection-view-2

Bug
在点击搜索后,再点击取消之后,会出现下图问题,搜索条向上偏移了几十像素,多次点击还会累加,最终被导航条遮盖。

searchController 使用出现的懵逼bug_第1张图片
bug.png

最终发现是由于

    self.tableView.tableHeaderView = self.searchController.searchBar
    self.definesPresentationContext = true

这两行代码顺序写反了导致的。

这里解决了在模拟器里的问题。不过真机依然会有

最后发现 如果使用了IQ插件 并全局设置了
IQKeyboardManager.sharedManager().enable = true
之后 会导致真机会有这个问题。

下面贴下完整代码

var tableView: UITableView!

var searchController: UISearchController!

let cities = ["New York, NY", "Los Angeles, CA", "Chicago, IL", "Houston, TX",
                         "Philadelphia, PA", "Phoenix, AZ", "San Diego, CA", "San Antonio, TX",
                         "Dallas, TX", "Detroit, MI", "San Jose, CA", "Indianapolis, IN",
                         "Jacksonville, FL", "San Francisco, CA", "Columbus, OH", "Austin, TX",
                         "Memphis, TN", "Baltimore, MD", "Charlotte, ND", "Fort Worth, TX"]

var searchArr: [String] = [String](){
    didSet {
        // 重設 searchArr 後重整 tableView
        self.tableView.reloadData()
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    setupUI()
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    self.perform(#selector(AddressChoiceViewController.searchBarBecomeFirstResponder), with: nil, afterDelay: 0.01)
}
func setupUI() {
    view.backgroundColor = UIColor(Color_GlobalBackground)
    title = "当前城市-深圳"
    // 建立 UITableView
    self.tableView = UITableView(frame: CGRect(
        x: 0, y: 0,
        width: ScreenWidth,
        height: ScreenHeight),style: .plain)
    self.tableView.register(UITableViewCell.self,forCellReuseIdentifier: "Cell")
    self.tableView.delegate = self
    self.tableView.dataSource = self
    self.view.addSubview(self.tableView)
    
    
    // 建立 UISearchController 並設置搜尋控制器為 nil
    self.searchController = UISearchController(searchResultsController: nil)
    
    // 將更新搜尋結果的對象設為 self
    self.searchController.searchResultsUpdater = self
    
    // 搜尋時是否隱藏 NavigationBar
    // 這個範例沒有使用 NavigationBar 所以設置什麼沒有影響
    self.searchController.hidesNavigationBarDuringPresentation = true
    
    // 搜尋時是否使用燈箱效果 (會將畫面變暗以集中搜尋焦點)
    self.searchController.dimsBackgroundDuringPresentation = true
    
    // 搜尋框的樣式
    self.searchController.searchBar.searchBarStyle = .prominent
    
    // 設置搜尋框的尺寸為自適應
    // 因為會擺在 tableView 的 header
    // 所以尺寸會與 tableView 的 header 一樣
    
    self.searchController.searchBar.sizeToFit()
    
    // 將搜尋框擺在 tableView 的 header
    self.tableView.tableHeaderView = self.searchController.searchBar
    
    self.definesPresentationContext = true
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

func backButtonAction() {
    navigationController?.pop(animated: true)
}
func searchBarBecomeFirstResponder(){
    self.searchController.searchBar.becomeFirstResponder()
}

Delegate 方法 自己实现下就行了。

你可能感兴趣的:(searchController 使用出现的懵逼bug)