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