如何解决从同一表中另一个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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。