表头内的Swift UITextField。

问题描述 投票:0回答:1

我有一个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)
    }
}
swift uitableview uicollectionview uitextfield
1个回答
0
投票

好吧,通过在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()
            }
        }
    }

0
投票

不是确切的解决方案,但是,作为一个无故事板爱好者,我会添加textfield作为collectionView的子视图,并将collectionview嵌入到顶部作为搜索条的高度。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.