ios - Firebase Swift - 当搜索 Controller 过滤结果时,实时更新不起作用

标签 ios swift firebase search uisearchcontroller

我正在使用 Swift 和 Firebase 制作 iOS 应用。 View Controller 检索/观察项目并将它们存储在项目数组中。项目单元格具有 + 和 - 按钮,可使用其索引路径对项目数量执行更新。

如果我使用搜索 Controller 来过滤项目,我可以将搜索结果存储在filteredItems数组中。我正在尝试更新这些过滤项目的数量,但当我点击 + 或 - 按钮时,它们只会更新一次,并且不会在搜索结果 View 中显示更新(没有单独的 View ,我在同一 View 中使用数据源显示过滤项目)。即使我点击多次,它也总是更新一次。

一旦我通过取消搜索栏返回到常规 View ,我会看到 1 向上或向下取决于我点击的按钮。有谁知道这可能是什么原因造成的?

class ItemsViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, SortTypeTableViewControllerDelegate, ItemListCellDelegate {
private var items = [Item]()
private var filteredItems = [Item]()

private func retrieveFirebaseData(sortType: ItemSort.SortType, sortOrder: ItemSort.SortOrder) {
guard let currentUser = Auth.auth().currentUser else {
  return print("user not logged in")
}

let itemsRef = DatabaseReferenceHelper.usersRef.child(currentUser.uid).child("items")

itemsRef.queryOrdered(byChild: sortType.rawValue).observe(.value) { (snapshot) in
  var newItems: [Item] = []

  for item in snapshot.children {
    let item = Item(snapshot: item as! DataSnapshot)
    if self.displayFavoritesOnly == true {
      if item.favorite == true {
        newItems.append(item)
      }
    } else {
      newItems.append(item)
    }
  }

  self.items = sortOrder == .ascending ? newItems : newItems.reversed()
  self.collectionView.reloadData()
}
}

// this is from item cell delegate
func increaseDecreaseQuantity(_ sender: ItemListCell, increment: Bool) {
  guard let tappedIndexPath = collectionView.indexPath(for: sender) else {
    return
  }

  let item: Item
  item = isFiltering() ? filteredItems[tappedIndexPath.item] : items[tappedIndexPath.item]

  let updatedQuantity = increment == true ? item.quantity + 1 : item.quantity - 1

  guard let currentUser = Auth.auth().currentUser else {
    return print("user not logged in")
  }

  let itemsRef = DatabaseReferenceHelper.usersRef.child(currentUser.uid).child("items")

  itemsRef.child(item.key).updateChildValues(["quantity": updatedQuantity])

}


// Here's the search logic I learned from Ray Wenderlich
private func searchBarIsEmpty() -> Bool {
  return searchController.searchBar.text?.isEmpty ?? true
}

private func filterContentForSearchText(_ searchText: String, scope: String = "All") {
  filteredItems = items.filter({$0.title.lowercased().contains(searchText.lowercased())})
  collectionView.reloadData()
}

private func isFiltering() -> Bool {
  return searchController.isActive && !searchBarIsEmpty()
}


extension ItemsViewController: UISearchResultsUpdating {

  func updateSearchResults(for searchController: UISearchController) {
    filterContentForSearchText(searchController.searchBar.text!)
  }
}

最佳答案

在每个+和-之后重新加载你的collectionView。重新加载 Collection View 后,新的更新将可见。

关于ios - Firebase Swift - 当搜索 Controller 过滤结果时,实时更新不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49982238/

相关文章:

ios - 支付你的钱 nsurl 错误空字符串

ios - 如何将 MapView 中的注释链接到其调用引脚

ios - Firebase + 快速检索用户数据

ios Firebase 推送通知项目

ios - 处理核心基础类时的内存管理问题

ios - 在纵横比中设置图像高度在 Xcode 中填充自动布局

ios - 在 iOS 上同时下载多少是有意义的

ios - 在 iOS 上将 ARKit 与 Metal 结合使用时如何过滤掉模糊图像?

swift - 强制更新 Apple Watch 上的占位符复杂功能

android - Firebase 或 SQLite