【问题标题】:UITableViewController not scrolling view when keyboard appears键盘出现时UITableViewController不滚动视图
【发布时间】:2012-06-29 22:02:19
【问题描述】:

我有一个UITableViewController,其中包含大约 20 个静态单元格,其中一些单元格中包含 UITextFields,而有些则仅用于使用复选标记进行选择。该表格大约需要 1.5 个视图,因此需要滚动才能到达较低的文本字段。

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

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

IOS 5.1,iPad 肖像。

【问题讨论】:

  • 不是一个重复的 IMO,这个处理静态单元 TVC 的
  • Rishi 指出的链接实际上也适用于我的静态表格内容。但就像我说的,我虽然这意味着在使用 UITableViewController 时自动工作,而不需要以编程方式管理滚动。
  • 我找到了问题的原因。我的应用程序启动了一个弹出窗口,在该弹出窗口中有一个按钮可以打开一个包含表格的全屏模型视图 UITableViewController。如果我不在层次结构中使用弹出框,则 TVC 将在单击字段时自动滚动表格,弹出框回到层次结构中,然后它会失去 TVC 的滚动功能。不知道如何解决这个问题,但它取得了一些进展。

标签: ios uitableview cocoa-touch uitextfield


【解决方案1】:

如果 UITableViewController 的自动滚动不起作用 单元格中的 UITextFields 或奇怪地滚动,请执行以下步骤。 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)
}

【讨论】:

    【解决方案2】:

    确保如果您要覆盖您调用的viewWillAppear

    [super viewWillAppear:animated];
    

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

    斯威夫特

    super.viewWillAppear(animated)
    

    【讨论】:

    • 这对我有用(无论如何我都应该调用它)。谢谢。
    • 哦!非常感谢,我以为我再也不会让它自动工作了)
    • 你知道吗...你是我的上帝!
    • ThnQ @EIJay 它节省了我的时间
    • 这是一个很好的例子,为什么你应该总是调用 super,尤其是在文档中明确指定的情况下))
    【解决方案3】:

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

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

    【讨论】:

    • 我在使用容器视图时遇到了类似的问题。
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-02
      • 2014-08-20
      • 2012-02-01
      • 2015-02-02
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多