在 tableView 中交换和重新加载不同 Realm 对象的数据



问题我想允许用户在表格单元格中点击"交换",然后找到一个不同的 Realm 对象,用新对象的值填充单元格中的 2 个文本标签(用于练习名称和重复次数(。

研究关于"移动行"(例如,这里如何在表格视图中相互交换两个自定义单元格?(和这里(UITableView 交换单元格(有很多(诚然是旧的(,然后显然有很多关于重新加载数据本身,但我在这个用例上找不到任何东西。

我试过什么,下面的代码可以很好地检索新对象。 即单元格中有一些数据,然后当您点击"交换按钮"时,它会抓取另一个准备放入 tableView 的数据。 我通常知道如何重新加载数据,但不在一个特定的单元格内(特定交换按钮所属的单元格......每个单元格都有一个"交换按钮"(。

我猜我需要以某种方式找到"swapButton"的 indexRow,然后访问该特定单元格的单元格属性,但不确定从哪里开始(我已经尝试了许多不同的变体,但我只是猜测,所以它不起作用!

class WorkoutCell : UITableViewCell {
@IBOutlet weak var exerciseName: UILabel!
@IBOutlet weak var repsNumber: UILabel!
@IBAction func swapButtonPressed(_ sender: Any) {
swapExercise()
}
func swapExercise() {
let realmExercisePool = realm.objects(ExerciseGeneratorObject.self)
func generateExercise() -> WorkoutExercise {
let index = Int(arc4random_uniform(UInt32(realmExercisePool.count)))
return realmExercisePool[index].generateExercise()
}
}
//do something here like cell.workoutName 
//= swapExercise[indexRow].generateExercise().name??? 
}

将对象保存在显示 UITableView 的 VC 中的某个位置。然后将 VC 添加为要交换的目标按钮。实现按下按钮时的交换对象,之后重新加载表视图的数据。 整个想法是将逻辑移动到视图控制器,而不是在单独的单元格中。

有两种方法。 1. 添加 VS 作为按钮操作目标。

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = ... // get cell and configure it
cell.swapBtn.addTarget(self, action: #selector(swapTapped(_:)), for: .touchUpInside)
return cell
}
func swapTapped(_ button: UIButton) {
let buttonPosition = button.convertPoint(CGPointZero, toView: self.tableView)
let indexPath = self.tableView.indexPathForRowAtPoint(buttonPosition)!
// find object at that index path
// swap it with another
self.tableView.reloadData()
}
  1. 使 VC 成为单元格的委托。更多代码。在这里,您可以在单元格中创建协议并添加委托变量。然后,当您创建单元格时,您将分配给 VC 作为单元格的委托:

    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath( -> UITableViewCell { 让单元格 = ...//获取单元格并对其进行配置 cell.delegate = self 返回单元格 }

    func swapTappedForCell(_ cell: SwapCell( { 交换的相同逻辑 }

来自 OP 的解决方案我在这里调整了代码 如何使用按钮标签在 swift 中访问自定义单元格的内容?

我认为,使用委托和协议是实现这一目标的最可持续方式。

我希望这对其他人有同样的问题!

最新更新