当键盘出现时,UITableViewController不滚动视图

时间:2012-06-28 11:34:36

标签: ios uitableview cocoa-touch uitextfield

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

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

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

IOS 5.1,iPad Portrait。

5 个答案:

答案 0 :(得分:78)

如果您要覆盖viewWillAppear,请确保拨打

[super viewWillAppear:animated];

如果不这样做,滚动视图将无法正确向上滚动。

<强>夫特

super.viewWillAppear(animated)

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

如您所见,这个问题有不同的答案。

我的解决方案

确保为 tableView 返回 numberOfRows。

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

我不知道为什么这个函数对于静态 tableView 是必要的,但是实现它为我解决了这个问题。