使用UISearchController显示搜索结果,键盘覆盖UITableView中的底部行/部分

时间:2017-04-07 15:21:42

标签: ios swift uitableview uisearchcontroller

有一个UISearchController,它在UITableView中显示搜索结果,根据联系人名称将其拆分为字母部分和相应的行。

当搜索结果显示一些大于UITableView且显示键盘的联系人时,键盘将覆盖底部的行和部分。

在显示已过滤的搜索结果时,增加UITableView内容高度的最佳方法是什么,以便底部的联系人可以滚动到用户可见,以便iOS键盘不再覆盖它们?< / p>

我使用Swift 3.1和UISearchResultsUpdating委托和updateSearchResults方法来显示过滤结果。

2 个答案:

答案 0 :(得分:1)

键盘出现/消失时需要注意,并相应地设置tableView的contentInset

在TableViewController类中,创建两个函数作为键盘事件的响应者:

func keyBoardWillShow(notification: NSNotification) {
    if let keyBoardSize = notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? CGRect {
        let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyBoardSize.height, right: 0)
        self.tableView.contentInset = contentInsets
    }
}

func keyBoardWillHide(notification: NSNotification) {
    self.tableView.contentInset = UIEdgeInsets.zero
}

ViewDidLoaddeinit注册/取消注册响应者:

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

    // register the responders
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyBoardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyBoardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)

}

deinit {
    NotificationCenter.default.removeObserver(self)
}

答案 1 :(得分:0)

对于4.2或更高版本。 注册观察者。

override func viewDidLoad() {
    super.viewDidLoad()
    // register the responders
    NotificationCenter.default.addObserver(self, selector: #selector(keyBoardWillShow), name: UIResponder.keyboardWillShowNotification , object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyBoardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}

从iOS 9(和OS X 10.11)开始,如果您未使用基于块的观察者,则无需自己删除观察者。该系统将为您完成此操作,因为它会在可能的地方为观察者使用弱零引用。

响应事件的功能。

@objc func keyBoardWillShow(notification: NSNotification) {
    if let keyBoardSize = notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? CGRect {
        let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyBoardSize.height, right: 0)
        self.tableView.contentInset = contentInsets
    }
}

@objc func keyBoardWillHide(notification: NSNotification) {
    self.tableView.contentInset = UIEdgeInsets.zero
}