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)
因此,听起来每次按键都会执行搜索功能。有没有办法向文本字段添加去抖功能?您可以尝试将延迟设置较长的时间。
像这样的东西
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)
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |