如何删除inputAccessoryView并将其替换为另一个视图? 步骤1:步骤2:

问题描述

这是要求

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

我尝试过的事情

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

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

现在,当用户点击按钮时,我需要将{strong> customInputAccessoryViewNumberOne完全替换为customInputAccessoryViewNumberTwo

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

解决方法

只需两个步骤即可完成

步骤1:

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

步骤2:

在您的reloadInputViews()UITextField实例上调用UITextView

以下代码段对此进行了解释。

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,height: 40))
        redView.backgroundColor = .red
        textField.inputAccessoryView = redView
    }
    textField.reloadInputViews()
    return true
}

enter image description here

,

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

-放弃或显示键盘,以便可以使用 willBecomeFirstResponder resignFirstResponder

更改视图