15

我有一个UITableViewController大约 20 个静态单元格,其中一些单元格中有UITextFields,而有些只是用于选择带有复选标记。该表的价值约为 1.5 个视图,因此需要滚动才能到达较低的文本字段。

当我在表格底部的文本字段中单击时,键盘会按原样弹出,但随后会出现在单元格/文本字段上。

我的印象(来自Apple docs和其他地方)UITableViewController当键盘以任何方向出现并向上移动表格视图以使单元格可见时,该类会自动处理视图的滚动,但这并没有发生。

IOS 5.1,iPad 肖像。

4

4 回答 4

88

确保如果你覆盖viewWillAppear你调用

[super viewWillAppear:animated];

否则,滚动视图将无法正确向上滚动。

迅速

super.viewWillAppear(animated)
于 2012-06-28T11:42:50.677 回答
4

我发现这些答案都不正确。过了一会儿,我注意到如果你按下一个控制器,它不会工作......但如果你以模态方式呈现它......表格将自动滚动到使用的文本字段。

希望这可以节省任何人的时间和压力。

于 2015-02-09T01:49:05.370 回答
2

如果 UITableViewController 的自动滚动不适用于单元格中的 UITextField 或滚动异常,请执行以下步骤。Swift 5 iOS 13.2 测试 100%

首先实现viewWillAppear但不要调用super.viewWillAppear(这将停止自动滚动)

override func viewWillAppear(_ animated: Bool) {

}

然后让我们手动进行滚动。

override func viewWillAppear(_ animated: Bool) {

  //Notification center observers
  NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)),
                                             name: UIResponder.keyboardDidShowNotification, object: nil)
  NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)),
                                            name: UIResponder.keyboardWillHideNotification, object: nil)

}

//keybord show action
@objc func keyboardWillShow(notification: Notification) {
    tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: notification.getKeyBoardHeight, right: 0)
}
//keyboard hide action
@objc func keyboardWillHide(notification: Notification) {
    tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}

extension Notification {

    var getKeyBoardHeight: CGFloat {

        let userInfo: NSDictionary = self.userInfo! as NSDictionary
        let keyboardFrame: NSValue = userInfo.value(forKey: UIResponder.keyboardFrameEndUserInfoKey) as! NSValue
        let keyboardRectangle = keyboardFrame.cgRectValue
        return keyboardRectangle.height
    }

}

override func viewWillDisappear(_ animated: Bool) {
   super.viewWillDisappear(animated)
   NotificationCenter.default.removeObserver(self)
}
于 2020-05-18T17:13:40.627 回答
1

我自己遇到了这个问题。我刚刚将我的视图控制器从 UIViewController 转换为 UITableViewController 除了添加[super viewWillAppear:animated];调用之外,您还需要删除这些行:

[self.tableView setDataSource:self]; [self.tableView setDelegate:self];

因为它们不再需要并且 setDelegate 会干扰键盘滚动行为。

于 2014-02-24T22:55:59.247 回答