我有 tableView 大小由 AutoLayout 设置(底部到底部布局指南,顶部到另一个 View 等等,但首先是 UISearchBar 到顶部布局指南):
带有 tableView 的 Controller :
我需要在显示键盘时更改表格偏移量,所以我有以下两种方法:
// MARK: - Keyboard
func keyboardWasShown (notification: NSNotification) {
let info: NSDictionary = notification.userInfo!
let value: NSValue = info.valueForKey(UIKeyboardFrameBeginUserInfoKey) as! NSValue
let keyboardSize: CGSize = value.CGRectValue().size
self.tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0)
self.tableView.scrollIndicatorInsets = self.tableView.contentInset
}
func keyboardWillBeHidden (notification: NSNotification) {
self.tableView.contentInset = UIEdgeInsetsZero
self.tableView.scrollIndicatorInsets = UIEdgeInsetsZero
}
它工作正常,但在显示键盘时出现问题。无法选择最后一项,而是我得到了上一项。我点击了最后一项的位置,它应该导航到包含最后一项的详细信息页面,但我看到的是包含前一项的详细信息页面。它不是针对所有项目转移,而是针对最后一个项目转移,当我过滤到一个项目时它工作正常。当键盘被隐藏时(并且项目仍然被过滤)那么它也没关系(它选择了正确的东西)。所以我想问题一定出在这里:
self.tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0)
self.tableView.scrollIndicatorInsets = self.tableView.contentInset
那么问题出在哪里呢?感谢帮助
最佳答案
我找到了解决方案。我正在使用 UIKeyboardWillHideNotification
并且在 didSelectRowAtIndexPath
之前调用了方法 keyboardWillBeHidden
所以 tableView
的 contentInset
被设置回 UIEdgeInsetsZero
然后 indexPath 错误。所以现在我使用 keyboardDidHide
而不是 keyboardWillBeHidden
:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardDidShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardDidHide:", name: UIKeyboardDidHideNotification, object: nil)
...
func keyboardDidHide (notification: NSNotification) {
self.tableView.contentInset = UIEdgeInsetsZero
self.tableView.scrollIndicatorInsets = UIEdgeInsetsZero
}
关于选择显示键盘的单元格时,iOS TableView 的 indexPath 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31340760/