Ios 从同一表中另一个UITableViewCell的内容更新UITableViewCell

Ios 从同一表中另一个UITableViewCell的内容更新UITableViewCell,ios,swift,uitableview,Ios,Swift,Uitableview,我有一个UITableViewController,配置了一个由5个自定义单元格组成的静态表(这是一个表单) 单元格0捕获一个日期 单元格1是一个UICollectionView,其中填充了表示活动的图标。根据选择的活动,许多自定义UITableViewCell中的一个将在单元格2中动态加载 单元格2可以是简单的(仅一个滑块)、文本字段或更复杂的(UITableView) 单元格3有一个用于捕获描述的文本字段 第4单元用于附加注释 到目前为止,一切正常。我在单元格1中选择一个活动,在单元格2

我有一个UITableViewController,配置了一个由5个自定义单元格组成的静态表(这是一个表单)

  • 单元格0捕获一个日期
  • 单元格1是一个UICollectionView,其中填充了表示活动的图标。根据选择的活动,许多自定义UITableViewCell中的一个将在单元格2中动态加载
  • 单元格2可以是简单的(仅一个滑块)、文本字段或更复杂的(UITableView)
  • 单元格3有一个用于捕获描述的文本字段
  • 第4单元用于附加注释
到目前为止,一切正常。我在单元格1中选择一个活动,在单元格2中加载匹配的XIB,捕获数据,添加注释等,并保存表单。我遇到的问题是,根据单元格2中的输入,我想自动更新单元格3。我让它工作,但我觉得它不优雅或干净,所以将感谢其他人的投入。在

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

// main table cells pseudo code
switch indexPath.row {
    case 0:
        <#code#>
    case 1:
       // dequeue collectionviewcell
    case 2:
      // dequeue the relevant uitableviewcell based on selected cell in the uicollectionview
        switch selectedIndexPath.row {
            case 2:
                <#code#>
            default:
                <#code#>
        }
    case 3:
      // handle the description field
    default:
        <#code#>
}
并且主表中的单元3被出列并配置

case 3:
    let cell = tableView.dequeueReusableCell(withIdentifier: "eventDescriptionCell", for: indexPath) as! eventDescriptionCell

    if !selectedMedsName.isEmpty {
        cell.eventDescriptionTextField.text = selectedMedsName.joined(separator: ", ")
    }

   
有些事情告诉我,在案例2中(cell.returnValue{…})的闭包(cell.returnValue{…})即使有效,也不是正确的方法。。。有什么建议吗?
谢谢

我认为实现这一点的一个好方法是创建一个自定义委托。 让我们把它命名为ActivityCellDelegate。您可以这样创建它:

protocol ActivityCellDelegate: class {
    func activitySelected(_ activity: Activity)
}
我们使用“类”以便可以使委托引用为“弱”引用。否则XCode将导致故障:)

使用枚举表示不同的活动是一种很好的方法。您还可以使用字符串作为标识符,或者使用Int作为id

enum Activity {
    case activity1
    case activity2
    ...
}
将委托属性添加到TableViewCell:

weak var cellDelegate: ActivityCellDelegate?
然后,在对单元格进行排队时,将其委托设置为self
cell.celldegate=self
,并使将tableView作为子视图的控制器符合委托协议

extension TableViewController: ActivityCellDelegate {
    
    func activitySelected(_ activity: Activity) {
        //...in here you would probably reload the third cell in the table view. You could add an additional property in the ViewController in order to know which activity is currently selected.
    }
}
最后,当用户在
collectionView:didSelectItemAtIndexPath:
中选择CollectionViewCell以选择活动时,应调用委托方法:

delegate?.activitySelected(.activity1)

比额外数组更好的方法是在数据模型中保持单元格的
isSelected
状态。而且
cellForRow
中的许多
map
表达式也可能会花费不必要的费用。谢谢您的建议。。我对应用程序的性能/评测没有太多的关注,但我会做一些工作并清理那些昂贵的部分(我可能在map/filter/reduce:)上做得太过火了)。至于你的建议。数据模型(我假定为表),它是对selectedMedsName的引用,并在数据模型中构建它吗?难以遵循。模型是数据源数组,它包含每行的数据。“某物告诉我”具体是什么?直觉不是一件可以客观处理的事情。我认为自己是一个业余爱好者,这是我编写的个人应用程序,而不是我计划在App Store上应用的个人应用程序。在我的学习过程中,我希望编写干净的代码或遵循最佳实践,而一些OO概念仍然具有挑战性。在这种情况下,当它按原样工作时,我的直觉告诉我有更好的方法,我会给学员一个很好的尝试。谢谢您的建议。我会尝试一下,在这个过程中整理我的代码
delegate?.activitySelected(.activity1)