在tableView中为不同的Realm对象交换和重装数据

时间:2018-05-14 22:30:37

标签: ios swift uitableview

问题我想让用户点击' 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??? 
}

2 个答案:

答案 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()
}
  1. 使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?

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

我希望这可以帮助其他人解决同样的问题!