快速,从具有 CustomCells 的 tableViewCells 中检索更改的数据

Posted

技术标签:

【中文标题】快速,从具有 CustomCells 的 tableViewCells 中检索更改的数据【英文标题】:swift, retrieve changed data from tableViewCells that have CustomCells 【发布时间】:2020-04-09 17:07:19 【问题描述】:

这个问题在很多地方都被问过好几次了,但是理解和解决它非常困难。

我的问题不一样,研究了5个多小时才问这个问题。

我有一个 tableView,其中有 3 种不同类型的 CustomCell。

我的自定义单元格有 3 个东西,2 个通用标签和一个 TextField。第三项(步进器、按钮、开关)

我已经动态放置了 10 个调用的单元格

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

理想中我想做的事->

当我的用户更改单元格上的数据时,我想获取所有“更新”的数据,以便在单击“保存”时将其保存到我的数据库中。

我尝试过使用

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

并使用断点,显然当我触摸单元格时会触发代码块。不幸的是,触摸实际上是指触摸列表条目的主体。

如果我使用自定义单元格中的 UI 项(步进器/开关),则不会触发此代码部分。

我见过使用标签和委托的解决方案,但由于我是 ios 新手,我不确定如何实施或继续。我正在使用 Angela 的 Udemy iOS 课程自学。

自定义单元格

整个屏幕,当用户更改它们时,我喜欢获取文本字段值

【问题讨论】:

那么您是否尝试处理来自单元格内的步进器/开关的每个单独的触摸/动作事件? 我附上了照片,如果你把全屏想象成一个表格,我想获取屏幕所有的当前值 两张照片是一样的。我现在正在写一个答案。 德普。更新了图片:) 【参考方案1】:

(已测试) 您好,我用来解决此问题的一种方法是将处理程序函数添加到您已初始化 tableView 的子类之外。

    //.... This is your cellForRowAt tableView function..
    let cell = self.tableView.dequeueReusableCell(withIdentifier: cellId) as! cellSubclass
    cell.stepperButton.addTarget(self, action: #selector(handleStep(_:)), for: .valueChanged)
    return cell


@objc func handleStep(_ sender: UIStepper) 
    print(sender.value)
    let indexPath : IndexPath = IndexPath(item: 0, section: 0) 
    // Put the correct item # to locate where you have the stepper,
    // Then create a separate function doing the same thing, but with the item 
    // number of the next cell where you get the value from the switch
    let cell = tableView.cellForRow(at: indexPath) as! cellSubclass
    cell.textField.text = "\(Int(sender.value))"

您正在通过创建单元格的函数内部的 addTarget 方法连接 UIStepper。

这是我的结果图片:

提示:添加stepper.minimumValue = 0 这会在值 == 0 时禁用 [ - ] 按钮。

【讨论】:

这行得通!我有一种感觉,这不是正确的方法。因为,我的自定义单元格有一个“标签”和“文本字段”,我觉得我必须创建另一个“addTarget”来获取标签。而且,对于每个不同的单元格,我都必须这样做吗?如果我错了,请纠正我 关于标签的第一个问题,只需从同一个函数中调用它,例如:在 handleStep 中,在“let cell = ...”之后,打印(cell.labelName.text)跨度> 对于其他单元格,(我看到只有两个,所以我认为这样工作不会太多),是的,您只需在 cellForRowAt 中添加另一个 addTarget。例如:如果 indexPath.row == 0 cell.stepper.addTarget .... 否则 cell.switch.addTarget ... 。如果您添加更多具有更多功能的单元格,则可以使用 switch 语句。是的,可能有一种更清洁的方法可以做到这一点,但我只是脱离了我所知道的 :) 哈哈 现在,它有惊人的帮助!感谢您的帮助,因为我是新手,我相信我会学习更多更简洁的技术来处理我的代码。 :) 有点愚蠢的问题,但是请问有什么好方法可以将 IndexPath 的项目编号传递给#selector 方法?

以上是关于快速,从具有 CustomCells 的 tableViewCells 中检索更改的数据的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 在运行时切换到不同的 CustomCells

在 Xcode5 中创建 CustomCells

快速获取具有一对多关系的核心数据

我想要一个查询从 table2 中选择超过 4 个 AccountId 重复,在 table1 中具有不同的名称

freemaker 快速入门

在列表中有效地重复data.table,从循环中的另一个data.table顺序替换具有相同名称的列