问题描述
我有一个表格视图,它就像一个小结账篮。它工作得很好。在幕后,物品通过服务被放入一个数组中,当用户更新数量时,它会正确注册,如下所示:
[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 (将#修改为@)