Ios 如何删除inputAccessoryView并用另一个视图替换它?

Ios 如何删除inputAccessoryView并用另一个视图替换它?,ios,swift3,uikit,Ios,Swift3,Uikit,以下是要求 基本聊天应用程序,在UICollectionViewController 我使用override var inputAccessoryView添加此自定义输入附件视图,并在此函数中返回自定义视图 我有一个要求,即我需要在某个特定功能的某个点用另一个自定义输入附件视图替换此inputAccessoryView 我尝试过的 问题1:我尝试了removeFromSuperView() 问题2:如何再次调用覆盖方法并返回另一个自定义输入附件视图 下面是我如何添加第一个输入附件视图的方

以下是要求

  • 基本聊天应用程序,在
    UICollectionViewController
  • 我使用
    override var inputAccessoryView
    添加此自定义输入附件视图,并在此函数中返回自定义视图
  • 我有一个要求,即我需要在某个特定功能的某个点用另一个自定义输入附件视图替换此
    inputAccessoryView
我尝试过的

  • 问题1:我尝试了
    removeFromSuperView()
  • 问题2:如何再次调用覆盖方法并返回另一个自定义输入附件视图
下面是我如何添加第一个输入附件视图的方法

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
        }
    }
现在,当用户单击按钮时,我需要将
CustomInputAccessoryViewNumber One
完全替换为
CustomInputAccessoryViewNumber

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

你可以通过两个步骤来完成

步骤1: 当条件满足时,设置输入附件视图

步骤2: 对
UITextField
UITextView
的实例调用
reloadInputViews()

下面的代码片段对此进行了解释

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
}

因此,显然每次显示或取消显示键盘时都会调用覆盖方法(并且在显示或取消键盘时会多次调用覆盖方法,以便根据键盘的当前位置渲染视图)。 我们可以在
override var inputAccessoryView
方法中使用一个简单的标志和if语句替换输入附件,方法是返回相应的UIView()


-要缩小或显示键盘以便更改视图,请使用将成为FirstResponder辞职FirstResponder

这是一个很好的解决方案,但在我的情况下,文本字段位于输入附件视图中。这是一个聊天应用程序,因此文本字段是带有额外发送按钮的输入附件视图。