【问题标题】:UITableView auto scrolling issue on keyboard appearanceUITableView 键盘外观上的自动滚动问题
【发布时间】:2020-01-16 05:50:39
【问题描述】:

我使用普通的UITableViewControllerstatic cells(1 个单元格)。里面有几个UITextfields,里面有StackView 由于它是一个 UITableView,所以滚动是自动处理的,但问题是当点击 UITextfield 时它会滚动到随机位置。

第一个屏幕截图是没有键盘的页面。 第二个屏幕截图是单击名字文本字段时(正常行为) 第三个屏幕截图是单击姓氏文本字段时(??!! 行为) 第四个屏幕截图是单击电子邮件文本字段时(再次???!!行为)

我没有使用任何外部键盘处理库

我没有使用任何代码来添加插图或处理滚动或处理键盘。

文本字段的放置顺序正确(TxtFname,TxtLname,TxtFatherName....)

UITextfields 被放置在 stackview 中。 谁能告诉我似乎是什么问题?

【问题讨论】:

  • 您使用哪个库作为键盘?
  • @AyazAkbar 没有库被使用。
  • 然后使用 IQkeyboardManager。这将自动处理
  • @AyazAkbar 尝试使用它,没有变化。它仍然随机!
  • func textFieldShouldReturn(_ textField: UITextField) -> Bool { let nextTag = textField.tag + 1 if let nextResponder = textField.superview?.viewWithTag(nextTag) { nextResponder.becomeFirstResponder() } else { textField.resignFirstResponder() } 返回真 }

标签: ios swift uitableview


【解决方案1】:

您可以使用第三方通过 UIView 或 UITableview 的滚动来处理键盘。
吊舱“IQKeyboardManager” 这是可以帮助您管理滚动的第三方。如果您不想滚动标题,请使其在与表格视图不同的视图中。并确保您正确使用了自动布局。

func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
    if tblProfile.isDecelerating {
        view.endEditing(true)
    }
}

当您手动滚动表格视图而不使用键盘进入下一个文本字段时使用此代码,此方法将被调用并隐藏键盘。一旦您点击文本字段,键盘就会再次出现。

【讨论】:

    【解决方案2】:

    您可以查看我之前的解决方案。它完全解决了所描述的问题。

    moving-keyboard-when-editing-multiple-textfields-with-constraints-swift

    【讨论】:

    • UITableView 不应该正确处理滚动吗?还是它被窃听了,或者我做错了什么?如果键盘不在屏幕上,视图也会向上移动到正确的位置。如果我按 Fname ,它会滚动到正确的位置。如果我关闭键盘并单击 Lname ,它会滚动到正确的位置。但是,如果我在键盘已经在屏幕上时单击 Lname,它会滚动到屏幕底部!
    • 所以理想情况下需要发生的是当您专注于任何文本字段时。您的视图(tblview)底部常量应该在键盘的高度,并且当点击完成按钮底部约束应该在其原始位置。你能显示一些键盘打开和关闭的代码吗?
    • 当你在没有第三方工具的情况下工作时。您需要了解此 UIView 是否需要移动等情况。假设您在顶部有一个字段,并且您正在移动 UIView,这会使您的字段消失,这没有任何意义。
    • 实际上没有用于键盘打开和关闭的代码,除了关闭键盘的小技巧。我只是为每个 UITextfield 拖了一个DidEndOnExit 出口并将其留空。所以只要用户点击返回,键盘就会消失
    • 感谢您的帮助。但这不是我想要的。我确实知道keyboardwillhide 和keyboardwillshow 通知的东西。我以前用过它:),以防viewcontroller中的tableview。我使用 TableViewController 是因为我只想拥有一个非重复单元格,即静态单元格,它可以像 scrollView 一样滚动,而不必忍受 ScrollViews 面临的问题。
    【解决方案3】:

    我已经为这个问题做了一个创可贴修复,结合了这里发布的不同答案和一些额外的答案。

     override func viewWillAppear(_ animated: Bool) {
               //  super.viewWillAppear(animated)
             }
    

    评论viewWillAppear(animated)会禁用UITableViewController的自动滚动。

    现在在 ViewDidLoad() 中添加了 2 个通知观察者

          NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    
    
            NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
    

    以及它们的作用

    @objc func keyboardWillShow(notification: NSNotification) {
            if !isKeyboardShowing {
                if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
                    let keyboardHeight = keyboardSize.height
    
                    let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber
                    let curve = notification.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as! NSNumber
    
                    adjustTableViewInsets(keyboardHeight: keyboardHeight, duration: duration, curve: curve)
                }
            }
        }
    
        @objc func keyboardWillHide(notification: NSNotification) {
            let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber
            let curve = notification.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as! NSNumber
            adjustTableViewInsets(keyboardHeight: 0, duration: duration, curve: curve)
        }
    
    

    这将确保即使键盘可见,用户也有额外的空间滚动到页面底部。

    现在我使用了IQKeyboardManager 的额外功能,即向上 n 向下箭头移动到下一个 UITextField 和完成按钮以关闭键盘。

    【讨论】:

    • 这是我们讨论过的理想方法:)
    • @Vasucd 好吧,这只有在禁用滚动的自动处理时才有效。这是最重要的!
    【解决方案4】:

    您好,使用

    遇到类似问题

    带有自定义单元格的 UITableview(具有 xib 和多个文本字段) 拥有 dropdown() 和 IQKeyboardManager(第三方使用)

    轻松解决

    在viewDidload里面你放的

    yourTextField.inputView.inputView = UIView()
    yourTextField.inputView.inputAccessoryView = UIView()
    

    【讨论】:

      【解决方案5】:

      【讨论】:

      • 我知道并尝试了其中的一些。但问题是,表格正在滚动,我可以滚动到表格底部。键盘并没有使任何东西无法触及。只是视图以随机方向滚动。有时向上,有时向下。
      猜你喜欢
      • 2018-09-05
      • 2014-03-13
      • 2017-01-30
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 2011-11-24
      相关资源
      最近更新 更多