Ios UITableViewController在键盘出现时不滚动视图

Ios UITableViewController在键盘出现时不滚动视图,ios,uitableview,cocoa-touch,uitextfield,Ios,Uitableview,Cocoa Touch,Uitextfield,我有一个UITableViewController,其中大约有20个静态单元格,其中一些单元格中有UITextFields,有些单元格仅用于选中。该表大约有1.5个视图,因此需要滚动才能获得较低的文本字段 当我在表格底部的文本字段中单击时,键盘会弹出,但随后会显示在单元格/文本字段上 我(从Apple文档和其他地方)得到的印象是,UITableViewController类在键盘以任何方向出现时自动处理视图的滚动,并将tableview向上移动以使单元格可见,但这并没有发生 IOS 5.1,iP

我有一个
UITableViewController
,其中大约有20个静态单元格,其中一些单元格中有
UITextField
s,有些单元格仅用于选中。该表大约有1.5个视图,因此需要滚动才能获得较低的文本字段

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

我(从Apple文档和其他地方)得到的印象是,
UITableViewController
类在键盘以任何方向出现时自动处理视图的滚动,并将tableview向上移动以使单元格可见,但这并没有发生


IOS 5.1,iPad人像。

确保如果覆盖
视图,将出现您调用的

[super viewWillAppear:animated];
否则,滚动视图将无法正确向上滚动

Swift

super.viewWillAppear(animated)

我自己也遇到了这个问题。我刚刚将视图控制器从UIViewController转换为UITableViewController,并添加了
[超级视图将显示:动画]调用,您需要删除以下行:

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


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

我发现这些答案中没有一个是正确的。过了一会儿,我注意到如果你按下一个控制器,它将无法工作。。。但是如果你以一种方式呈现。。表格将自动滚动至已使用的文本字段

希望这能为任何人节省时间和压力

如果UITableViewController的自动滚动与 在单元格中的UITextFields或奇怪地滚动时,执行以下步骤Swift 5 iOS 13.2 100%测试

第一个工具视图将出现,但不要调用超级。视图将出现(这将停止自动滚动)

然后让我们手动滚动

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)
}

正如你所看到的,这个问题有不同的答案

我的解决方案

确保返回tableView的numberOfRows

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 12
}

我不知道为什么这个函数对于静态表视图是必需的,但是实现它对我来说解决了这个问题。

可能重复的不是dup IMO,这个函数处理的是静态单元格TVC。Rishi指出的链接实际上也适用于我的静态表内容。但正如我所说,我认为这是为了在使用UITableViewController时自动工作,而无需通过编程管理滚动。我找到了问题的原因。我的应用程序启动一个popover,在该popover中有一个按钮,用于打开包含表格的全屏模型视图UITableViewController。如果我没有在继承人权限中使用popover,那么TVC将在单击字段时自动滚动表格,popover返回到层次结构中,那么它将丢失TVC的滚动功能。现在还不知道如何解决这个问题,但它取得了一些进展。这对我来说很有效(无论如何我都应该打电话给它)。谢谢,噢!非常感谢你,我想我再也不会让它自动工作了)你知道吗…你是我的上帝!ThnQ@EIJay它节省了我的时间这是一个很好的例子,为什么你应该总是调用super,特别是如果文档中明确指定了这一点的话。)我在使用容器视图时遇到了类似的问题。
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 12
}