Ios 执行点击关闭后,是否将结果传递给UITableViewCell内的按钮?
我正在寻找任何可能的方法,将网络更新的结果传递给UITableViewCell中的按钮作为结束 我有一些UITableViewCells,它们是产品。在这些单元格中,我有一个“添加到购物车”按钮。我在我的UITableViewCellIos 执行点击关闭后,是否将结果传递给UITableViewCell内的按钮?,ios,swift,uitableview,closures,Ios,Swift,Uitableview,Closures,我正在寻找任何可能的方法,将网络更新的结果传递给UITableViewCell中的按钮作为结束 我有一些UITableViewCells,它们是产品。在这些单元格中,我有一个“添加到购物车”按钮。我在我的UITableViewCellcellforRowAtIndexPath方法中设置了一个buttonTap闭包,在单元格中为按钮设置一个触摸处理程序,当调用该处理程序时,执行buttonTap闭包。我在主控制器上的cart对象上处理我的cart更新 如果他们可以向购物车添加更多项目,购物车更新操
cellforRowAtIndexPath
方法中设置了一个buttonTap
闭包,在单元格中为按钮设置一个触摸处理程序,当调用该处理程序时,执行buttonTap
闭包。我在主控制器上的cart对象上处理我的cart更新
如果他们可以向购物车添加更多项目,购物车更新操作的结果将返回true
。然后,我相应地更新按钮。我喜欢这种方法,因为我不必与代表打交道,我可以让所有的购物车逻辑本身远离单元;该单元只知道如何启用/禁用/加载按钮等
/// Buttom tap callback callback.
public typealias Selection = () -> Bool
class MealTableViewCell: UITableViewCell {
var buttonTap: Selection?
// Runs when tapping the button
func didTapAdd() {
if let buttonBlock = buttonTap {
self.button.isLoading = true
// Simulate loading
DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
self.button.enabled = buttonBlock()
self.button.isLoading = false
}
}
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = .... (fetch cell)
cell.buttonTap = {
// returns true if the user can add more items to their cart
return self.cart.update(product: product, quantity: 1)
}
}
我的问题是,目前,我的购物车都是本地的,没有API调用。我目前正在将购物车切换到API驱动的购物车,通过网络调用添加和删除项目。这意味着我不能再从我的cart.update(product:,quantity:)
方法返回BOOL,或者根本不能返回,因为它现在是一个异步调用
所以,我可以做一些类似于重写方法签名的事情
self.cart.update(product: product, quantity: 1, success: { canAddMore in
// API call succeeded
}, failure: { error in
// fall failed
})
问题是如何将canAddMore
传递到tableViewCell?如果我重新定义了Selection
的含义,即接收一个以bool为参数的块,我不能从控制器传入该参数,因为只有在单元本身上执行该块时,才会传入该参数
我怎么能做这样的事情
cell.buttonTap = {
cell.buttonTap = {
self.cart.update(product: product, quantity: 1), success: { canAddMore in
// !!!! What can I call here to pass canAddMore to the cell.
}, failure: { error in
}
}
}
canAddMore
实际上可以是任何值,BOOL就是这个例子。我的大目标是避免将任何关于单元加载和按钮的知识耦合到控制器本身。如果我使用委托,我必须有一个双向委托,使细胞成为控制器的委托,我总是觉得这是一种错误的方法。我不确定是否真的有可能将关闭的结果传回牢房,但我希望有可能
编辑:我真正想回答的一个大问题是,是否有可能通过闭包将数据传递回最初称为闭包的单元格(或任何对象)。在表视图中修改数据的方法有一百万种,但这是我试图解决的主要问题
我还“寻找”避免将canAddMore状态(例如,该产品的剩余数量)存储在为tableview供电的主“产品”数组中。初始状态设置在那里,从/products端点返回,但在此之后,carts API操作将返回库存是否可用。我认为您不想做您认为您想做的事情:) 简而言之,您可能希望跟踪Products数据数组中每个产品的“canAddMore”状态,然后在状态更改时更新表行,而不是尝试与调用闭包的单元格“对话”。所以
- 用户点击“添加到购物车”
- 在该行中提供视觉反馈,以显示您正在处理点击(将按钮变灰,或显示微调器,任何看起来不错的)
- 回调闭包以启动Add-to-cart API调用
- 当API调用返回时,更新本地产品数据以指示“canAddMore”状态
- 重新加载表中的行以更新按钮(使其处于活动状态、非活动状态、更改标题等)
无论如何,您几乎肯定需要执行类似的操作,因此当用户滚动并重用单元格时,每行中的按钮都会更新。通常的方法是使用回调中的
tableView.reloadRows(at:[indexPath],with:true)
更新单元格的内容。这将调用指定单元格的func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell
。不要忘记,这必须在主队列中完成 etc(每种产品)如何具有“CanadMore”状态?或者对于每种产品,整个购物车都有一个“CanadMore”状态。购物车上的updateItem
方法处理产品剩余数量等情况下的逻辑。确定-添加答案(sorta答案,但注释太多)…这肯定是一个好的开始,加载状态是我的粘滞者;如果我重新加载整个单元格,加载动画可能会有点不稳定。我还希望避免存储canAddMore状态(或数量或产品阵列上的内容);我从产品中获得初始可用数量,但添加到购物车后,我会在购物车API响应本身上处理。也许是个坏主意:)我认为这是不可避免的。您需要保存状态:/