选择带键盘的单元格时,iOS TableView错误的indexPath

时间:2015-07-10 12:26:47

标签: ios swift uitableview autolayout

我有通过AutoLayout设置的tableView大小(从底部到底部布局指南,顶部到另一个视图等等,但首先是UISearchBar到顶部布局指南): My tableView

带有tableView的控制器:

Controller settings

我需要在显示键盘时更改表偏移量,所以我有两种方法:

// 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

那么哪里可能有问题?谢谢你的帮助

2 个答案:

答案 0 :(得分:4)

我得到了解决方案。我使用UIKeyboardWillHideNotification并在keyboardWillBeHidden之前调用了方法didSelectRowAtIndexPath,因此contentInset的{​​{1}}被设置回tableView然后出现错误的indexPath 。现在我使用UIEdgeInsetsZero代替keyboardDidHide

keyboardWillBeHidden

答案 1 :(得分:1)

因此,假设Preset.set存储键盘高度(注意因为键盘框架可能因设备而异),请尝试以下操作:

~~~

在键盘隐藏时执行相同操作(但将keyboardHeight替换为CGRect *frame = [tableView frame]; frame.size.height -= keyboardHeight; [tableView setFrame:frame] )。