我有一个collectionview,其头部包含UITextField(基本上是一个搜索)。我想在编辑这个字段时更新collectionview数据。主要的问题是在调用collectionView.reloadData()后,键盘会被取消,所以我每次重载只能输入一个个字符。所以我每次重载只能输入一个个字符。我试过用reloadItems()代替reloadData(),但没有用。我怎样才能避免这种情况呢?我知道我可以把搜索字段放在collectionView之外,但这对我来说不是一个正确的解决方案。(你可以查看Instagram的搜索关注者)
我做了什么。
searchField.addTarget(self, action: #selector(textFieldChanged), for: .editingChanged)
然后把这些数据传给我的RestAPI服务器。
@objc func textFieldChanged(_ textField: UITextField) {
guard let searchQuery = textField.text else { return }
if !searchQuery.isEmpty {
APIService.sharedInstance.searchSubscribers(userId: user.id, token: User.sharedInstance.token, type: segment.selectIndex == 0 ? .followers : .following, query: searchQuery) { (fetchedUsers) in
DispatchQueue.main.async {
self.subcribersList = fetchedUsers
self.collectionView.reloadData()
}
}
} else {
fetchList(listType: segment.selectIndex == 0 ? .followers : .following, scrollAnimation: false)
}
}
好吧,通过在willDisplaySupplementaryView中设置我的搜索textField为第一响应者来解决。
func collectionView(_ collectionView: UICollectionView, willDisplaySupplementaryView view: UICollectionReusableView, forElementKind elementKind: String, at indexPath: IndexPath) {
let view = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "headerView", for: indexPath) as! SubscribersSearchHeader
if let searchQuery = view.searchField.text {
if searchQuery.count > 0 {
view.searchField.becomeFirstResponder()
}
}
}
不是确切的解决方案,但是,作为一个无故事板爱好者,我会添加textfield作为collectionView的子视图,并将collectionview嵌入到顶部作为搜索条的高度。