【问题标题】:How to remove inputAccessoryView and replace it with another view?如何删除 inputAccessoryView 并将其替换为另一个视图?
【发布时间】:2020-12-22 18:14:58
【问题描述】:

这是要求

  • 基本聊天应用程序,在UICollectionViewController 的键盘顶部有一个输入附件视图
  • 我使用override var inputAccessoryView 添加了这个自定义输入附件视图,并在这个函数中返回了自定义视图
  • 我有一个需求,我需要替换inputAccessoryView 在某个特定功能的某个时间点用另一个自定义输入附件视图

我的尝试

  • 问题 1:我尝试了 removeFromSuperView(),但在键盘上方留下了一个空白区域,等于已删除视图的高度,这可能是错误的
  • 问题 2:如何再次调用 override 方法并返回另一个自定义输入附件视图?

这是我添加第一个输入附件视图的方法

lazy var customInputAccessoryViewNumberOne: KeyboardView = {
        let civ = KeyboardView(frame: .init(x: 0, y: 0, width: view.frame.width, height: 50))
        civ.sendButton.addTarget(self, action: #selector(handleSend), for: .touchUpInside)
        return civ
    }()

override var inputAccessoryView: UIView? {
        get {
             return customInputAccessoryViewNumberOne
        }
    }

现在当用户点击按钮时,我需要完全替换 customInputAccessoryViewNumberOnecustomInputAccessoryViewNumberTwo

@objc func handleNewInputAccessoryViewPressed() {
  //how to remove customInputAccessoryViewNumberOne?
  //how to add customInputAccessoryViewNumberTwo?
}

【问题讨论】:

    标签: ios swift3 uikit


    【解决方案1】:

    显然,每次呈现或关闭键盘时都会调用 override 方法(并且在呈现或关闭时会多次调用它,以便根据键盘的当前位置呈现视图)。 我们可以在override var inputAccessoryView 方法中使用简单的标志和if 语句替换输入附件,方法是返回适当的UIView()。

    -要关闭或显示键盘以便可以更改视图,请使用 willBecomeFirstResponderresignFirstResponder

    【讨论】:

      【解决方案2】:

      两步就可以搞定

      第 1 步:

      当条件满足时设置你的输入附件视图

      第 2 步:

      在您的UITextFieldUITextView 实例上调用reloadInputViews()

      下面的代码sn-p解释一下。

      func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
          let finalText = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)
          
          guard let txt = finalText else { return true }
          if txt.count > 5 {
              let greenView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 40))
              greenView.backgroundColor = .green
              textField.inputAccessoryView = greenView
          } else {
              let redView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 40))
              redView.backgroundColor = .red
              textField.inputAccessoryView = redView
          }
          textField.reloadInputViews()
          return true
      }
      

      【讨论】:

      • 这是一个很好的解决方案,但在我的情况下,文本字段位于输入附件视图中。它是一个聊天应用程序,因此文本字段是带有额外发送按钮的输入附件视图。
      猜你喜欢
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 2010-09-29
      • 2015-11-20
      • 2020-01-16
      • 2018-12-02
      • 2015-11-23
      • 1970-01-01
      相关资源
      最近更新 更多