使用 Swift 输入嵌入 UICollectionView 标题单元格中的 UITextField 时如何防止键盘关闭?

Nat*_*n C 5 uitextfield uicollectionview swift

我想使用嵌入 UICollectionView 标题单元格中的自定义 UITextfield 来搜索 UICollectionView。我有一个委托方法,将输入的文本传递到主视图控制器,但是,您在文本字段中输入的每个字母都会导致键盘退出,因为集合视图已重新加载。

使用 Swift 输入嵌入 UICollectionView 标题单元格中的 UITextField 时如何防止键盘关闭?

// SearchHeaderView

protocol SearchHeaderViewDelegate: AnyObject {
    func search(with searchString: String)
}

class SearchHeaderView: UICollectionViewCell, UITextFieldDelegate {

    weak var delegate: SearchHeaderViewDelegate?

    lazy var searchContainerView: InputContainerView = {
        return InputContainerView(image: UIImage(named: "96_search_line")!,
                                  textField: searchTextField)
    }()

    let searchTextField = CustomTextField(placeholder: "Search",
                                          keyboard: .default,
                                          autoCapitalization: .words)

    override init(frame: CGRect) {
        super.init(frame: .zero)
        searchTextField.delegate = self
    }

    func textFieldDidChangeSelection(_ textField: UITextField) {
        if (searchTextField.text?.count)! != 0 {
            delegate?.search(with: textField.text!)
        }
    }
}

// ViewController

collectionView.register(SearchHeaderView.self, forSupplementaryViewOfKind:
                                UICollectionView.elementKindSectionHeader, withReuseIdentifier: "headerId")

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier:
                                                                    "headerId", for: indexPath) as! SearchHeaderView
    header.delegate = self
    return header
}

extension ViewController: SearchHeaderViewDelegate {
    func search(with searchString: String) {
        print("TESTING: Search containing \(searchString)")
        // search function...
        collectionView.reloadData() // causes the keyboard to close
    }
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*ima 0

因此,听起来每次按键都会执行搜索功能。有没有办法向文本字段添加去抖功能?您可以尝试将延迟设置较长的时间。

像这样的东西

import Combine

var cancellables = Set<AnyCancellable>()

override func viewDidLoad() {
  super.viewDidLoad()
  applyCombineSearch()
}

//Initialise the publisher and subscriber for search
func applyCombineSearch() {
  let publisher = NotificationCenter.default.publisher(for: searchTextField.textDidChangeNotification, object: viewController.collectionView.searchTextField)
  publisher
    .map {
      ($0.object as! CustomTextField).text
  }
  .debounce(for: .seconds(20), scheduler: RunLoop.main)
  .sink(receiveValue: { (value) in
    DispatchQueue.global(qos: .userInteractive).async { [weak self] in
      // Perform search
      DispatchQueue.main.async {
        collectionView.reloadData()
      }
    }
  })
  .store(in: &cancellables)
}
Run Code Online (Sandbox Code Playgroud)