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

问题描述

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

  • 单元格0捕获日期
  • 单元格1是一个UICollectionView,其中填充了代表活动的图标。根据选择的活动,在单元2中即时加载许多自定义UITableViewCell之一。
  • 单元格2可以是简单的(只是一个滑块),文本字段,也可以是更复杂的(UITableView)
  • 单元格3具有用于捕获描述的文本字段。
  • 单元格4用于其他注释

到目前为止,一切都按预期进行。我在单元格1中选择一个活动,将匹配的XIB加载到单元格2中,将捕获数据,添加注释等并保存表格。根据单元格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#>
}

特定活动将加载“ eventFlushMedTableViewCell”,该事件旨在在uitableview中显示药物列表。根据我选择的药物,我想取药物的名称并将其放在单元格3中。

case 2:
    let cell = tableView.dequeueReusableCell(withIdentifier: "eventFlushMedTableViewCell",for: indexPath) as! eventFlushMedTableViewCell
    // fill the meds table with the list of Rx meds
    cell.medsArray = medListArray.filter { $0.medRx == 1}.map {return $0.medname}

    // return the selected values from the table
    cell.returnValue = { selectedindexPaths in
        let indexList = selectedindexPaths.map { $0.row }
        self.selectedMedsName = indexList.map {cell.medsArray[$0]}
        // force a reload of cell 3
        let myIndexPath = IndexPath.init(row: 3,section: 0)
        tableView.reloadRows(at: [myIndexPath],with: .none)
    }
    return cell

并且主表中的单元格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 {...} )的正确方法不是正确的方法这样做...有什么建议吗? 谢谢

解决方法

我认为解决此问题的一种好方法是创建一个自定义委托。 我们将其命名为ActivityCellDelegate。您可以这样创建它:

protocol ActivityCellDelegate: class {
    func activitySelected(_ activity: Activity)
}

我们使用“类”,因此我们可以使委托“弱”引用。否则XCode会引起麻烦:)。

使用枚举表示不同的活动是一件很不错的事情。您还可以使用字符串作为标识符或使用整数作为ID。

enum Activity {
    case activity1
    case activity2
    ...
}

将委托属性添加到TableViewCell:

weak var cellDelegate: ActivityCellDelegate?

然后,在使单元出队时,将其委托设置为self cell.cellDelegate = 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)