【问题标题】:Another solution instead of tableView.reloadData()另一种解决方案,而不是 tableView.reloadData()
【发布时间】:2016-10-10 13:16:33
【问题描述】:

我正在使用此代码在 tableView 上调用批量更新(开始/结束更新):

  let oldImageSet = Set(oldImageArray)
  let newImageSet = Set(self.images)
  let missingImages = newImageSet.subtracting(oldImageSet)

  let missingImageIndexPaths = Array(missingImages).map{NSIndexPath(row: self.images.index(of: $0)!, section: 0)}
  //Array(missingImages).map{NSIndexPath(forRow:newImageUUIDArray.indexOf($0)!,inSection:1)}

  let removedImages = oldImageSet.subtracting(newImageSet)
  let removedImageIndexPaths = Array(removedImages).map{NSIndexPath(row:oldImageArray.index(of: $0)!,section:0)}

  self.tableView.beginUpdates()
  if missingImageIndexPaths.isEmpty == false {
        self.tableView.insertRows(at: missingImageIndexPaths as [IndexPath],with:.top)
  }

  if removedImageIndexPaths.isEmpty == false {
        self.tableView.deleteRows(at: removedImageIndexPaths as [IndexPath],with:.none)
  }
  self.tableView.endUpdates()

哪个工作正常。

编辑

这是我的 tableView 部分计数以及我如何设置它:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 55
}

func numberOfSections(in tableView: UITableView) -> Int {

    return posts.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

但现在我有另一个 tableView 我希望能够调用它,但它有“Sections”所以当我使用它时我会崩溃......?

有谁知道如何在带有部分的 tableView 上使用此代码?

非常感谢!

【问题讨论】:

  • 这与 [objective-c] 有什么关系?
  • @MartinR 好吧,我也会接受 objC 中的答案
  • 你能发布崩溃吗?
  • @AkhileshSharma 这里是 i.stack.imgur.com/5NEkO.png
  • 只是好奇你为什么要返回部分下的posts.count,这意味着如果有100个帖子,那么1行就会有100个部分

标签: ios swift uitableview


【解决方案1】:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 55
}

func numberOfSections(in tableView: UITableView) -> Int {

    return posts.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

用以下代码替换代码:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 55
}

func numberOfSections(in tableView: UITableView) -> Int {

    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return posts.count
}

【讨论】:

  • 是的,如果我不想为每个单元格设置一个标题,那就太好了!但是因为我需要标题,所以我有不止 1 个部分!所以我的代码是正确的,它调用我需要更改的批量更新
  • 您需要添加帖子数组并重新加载该部分并使用 self.tableView.insertSections 和 self.tableView.deleteSections 进行重新加载
  • 您插入的是行而不是节
  • 不确定如何设置,这就是我发布问题的原因!
  • 什么是帖子数组?
【解决方案2】:

您应该将您对行所做的事情应用到部分,这意味着将IndexPaths 更改为IndexSets。 IndexSet 可以用 Ints 的数组进行初始化,其中每个 Int 代表一个对应的部分。

  let oldImageSet = Set(oldImageArray)
  let newImageSet = Set(self.images)
  let addedImages = newImageSet.subtracting(oldImageSet)
  // map each image to the section equivalent to its index in `self.images`
  let addedImageSections = Array(missingImages).map{ self.images.indexOf($0)! }
  let addedImageIndexSet = IndexSet(addedImageSections)

  // repeat above process but in reverse to find images that have been removed
  let removedImages = oldImageSet.subtracting(newImageSet)
  let removedImageSections = Array(removedImages).map{ oldImageArray.index(of: $0)! }
  let removedImageIndexSet = IndexSet(removedImageSections)

  self.tableView.beginUpdates()

  // if images have been added insert new sections 
  if !addedImageIndexSet.isEmpty {
        self.tableView.insertSections(addedImageIndexSet, with: .top)
  }

  // if images have been deleted remove sections    
  if !removedImageIndexSet.isEmpty {
        self.tableView.deleteSections(removedImageIndexSet, with: .none)
  }
  self.tableView.endUpdates()

【讨论】:

  • 一如既往的棒!
猜你喜欢
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
相关资源
最近更新 更多