Swift - 表格视图单元格显示不正确的整数

问题描述

我有一个表格视图,它就像一个小结账篮。它工作得很好。在幕后,物品通过服务被放入一个数组中,当用户更新数量时,它会正确注册,如下所示:

[0] App.Item    
id  UUID    
title   String  "C" 
quantity    Int 3

[1] App.Item    
id  UUID    
title   String  "B" 
quantity    Int 2

[2] App.Item    
id  UUID    
title   String  "A" 
quantity    Int 1

该应用完美地展示了这一切。当我添加具有相同名称的项目时,问题就出现了。假设我添加了另一个名为 C 的项目。我还应该说,在这一点上,我不是追加到数组,而是在 0 处插入新值,因为为了设计的目的翻转了表视图,所以一切都是有点颠倒,但一切都很好。

添加一个新的 C 后(每一项都以认值 1 开头),控制台显示

[0] App.Item    
id  UUID    
title   String  "C" 
quantity    Int 1

[1] App.Item    
id  UUID    
title   String  "C" 
quantity    Int 3

正如预期的那样。新值放入数组的第一个值,另一个C向上移动。但是在应用程序上,视图现在显示“A”的值为 2,而 B、C 和 C 的值为 1。经过多次测试后,该行为确实是随机的。数字会变成任何它想要的样子。所以为什么它在后端是完美的,但在前端却出问题了。

这个项目的代码库非常广泛,所以我会尽我所能向你展示发生了什么,但如果你觉得你需要更多代码,请尽管问。非常感谢你,如果你甚至阅读这篇文章!任何帮助真的意义重大。谢谢:)

为了添加项目,我从文本字段中获取一个值,创建一个认值为 1 的新项目。使用我的服务将其添加到项目数组中。将该数组传递给我的视图控制器,我的表视图使用该数组创建一个新的 ItemTableViewCell,如下所示:

func landingViewControllerDidPresstextFieldButton(_ viewController: LandingViewController,text: String) {
    let item = Item(title: text)
    itemService.addItem(item)
    viewController.items = itemService.getItems() //View controllers array of [Item] gets populated with the new Item array
    viewController.hoMetableView.insertRows(at: [IndexPath.init(row: 0,section: 0)],with: .right)
  }

Item 服务很简单,看起来像这样,最重要的是 'Quantity' 总是从 1 开始。

struct Item {
  let id: UUID
  let title: String
  var quantity: Int

  init(title: String,quantity: Int = 1) {
    self.id = UUID()
    self.title = title
    self.quantity = quantity
  }
}

class DefaultItemService: ItemService {

  private var items: [Item] = []

  func addItem(_ item: Item) {
    items.insert(item,at: 0)
  }

  func updateQuantity(position: Int,quantity: Int) {
    items[position].quantity = quantity
  }

  func getItems() -> [Item] {
    return items
  }
}

表格视图代码:(它通过枚举切换,在视图控制器中动态显示等于items.length的单元格数量。)

case .items:
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "Item",for: indexPath) as?
            ItemTableViewCell,indexPath.row < items.count else {
      return TableViewCell()
    }
    cell.contentView.transform = CGAffineTransform(scaleX: 1,y: -1)
    cell.title = items[indexPath.row].title
    cell.delegate = self
    return cell

我怀疑最有可能是问题所在,尽管事实证明确实很难排除故障。负责显示项目的视图。 (我已将其编辑为仅相关部分)

protocol ItemTableViewCellDelegate: class {
  func itemTableViewCellDidChangeQuantity(_ itemCell: ItemTableViewCell,quantity: Int)
}
---
private lazy var quantityLabel = Label.main.h1Skinny(text: "1") //this used to be "\(quantity)"

private var quantity = 1

@objc func userDidTapAdd() {
    quantity += 1
    quantityLabel.text = quantity.description //again used to be \(quantity),just hoped in vain this would fix it lol
    delegate?.itemTableViewCellDidChangeQuantity(self,quantity: quantity)
  }

@objc private func userDidTapMinus() {
  guard quantity > 0 else {
    // Functionality to remove item
    return
  }
  quantity -= 1
  quantityLabel.text = quantity.description
  delegate?.itemTableViewCellDidChangeQuantity(self,quantity: quantity)
  }

那个委托在我的登陆视图中被扩展,它只是获取改变了数量的单元格的索引路径,并将其传递给另一个委托方法

extension LandingViewController: ItemTableViewCellDelegate {
  func itemTableViewCellDidChangeQuantity(_ itemCell: itemTableViewCell,quantity: Int) {
    guard let indexPath = hoMetableView.indexPath(for: itemCell) else { return }
    delegate?.landingViewControllerItemQuantityDidChange(self,cellForRowAt: indexPath.row,quantity: quantity)
    hoMetableView.reloadData()
  }
}

最后,当用户按下 + 或 - 按钮时更改数量功能

func landingViewControllerItemQuantityDidChange(_ viewController: LandingViewController,cellForRowAt row: Int,quantity: Int) {
  itemService.updateQuantity(position: row,quantity: quantity)
  viewController.items = itemService.getItems()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)