问题我想让用户点击' swap'在表格单元格中,然后找到一个不同的Realm对象,用新对象中的值填充单元格中的2个文本标签(对于练习名称和代表数量)。
研究在移动的行中有相当多的(不可否认的是旧的)' (例如,此处How to swap two custom cells with one another in tableview?)以及此处(UITableView swap cells)然后显然有很多重新加载数据但我无法在此用例中找到任何内容。
我尝试了什么我的代码可以很好地检索新对象。即单元格中有一些数据,然后当你点击“swapButton”时。它抓住另一个准备放入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???
}
答案 0 :(得分:0)
将您的对象保存在显示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()
}
使VC成为单元格的委托。更多代码。在这里,您可以在单元格中创建协议并添加委托变量。然后,当您创建单元格时,您将VC指定为单元格的委托:
public func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath) - > UITableViewCell { 让cell = ... //获取单元格并进行配置 cell.delegate = self 返回细胞 }
func swapTappedForCell(_ cell:SwapCell){ //交换的逻辑相同 }
答案 1 :(得分:0)
来自OP的解决方案我在此处调整了代码How to access the content of a custom cell in swift using button tag?
我认为使用代理和协议是实现这一目标的最可持续的方式。
我希望这可以帮助其他人解决同样的问题!