【问题标题】:Can't pass realm data from tableViewController to viewController无法将领域数据从 tableViewController 传递到 viewController
【发布时间】:2021-05-10 10:59:22
【问题描述】:

我在将领域对象的数据从 tableViewController 传递到 viewController 时遇到了困难。我想从表中选择一个对象,并在下面的 viewController 中使用该对象的数据。我一直在努力在这里找到处理领域对象的资源,而不仅仅是传递字符串等。任何帮助都会很棒。

这是我的 TableViewController,我尝试为第二个视图创建一个 segue 函数:

class WorkoutController: UITableViewController {
    
override func viewDidLoad() {
    super.viewDidLoad()
    
}

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return DBHelper.shared.getWorkout().count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    if cell == nil {
        cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
    }
    let muscle = DBHelper.shared.getWorkout()[indexPath.row]
    cell.textLabel?.text = muscle
    return cell
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let workoutDetailVC = segue.destination as! WorkoutDetail
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let name = DBHelper.shared.getWorkout()[indexPath.row]
        
        workoutDetailVC.receivedName = name
    }
}

}

这是应该接收和显示数据的 WorkoutDetail 类:

class WorkoutDetail: UIViewController {

@IBOutlet weak var muscleLabel: UILabel!

var receivedName = ""

override func viewDidLoad() {
    super.viewDidLoad()

    muscleLabel.text = receivedName
}

}

这是上面引用的 getWorkout() 函数:

func getWorkout()-> [String] {
    var musclesName = [String]()
    let storedExercise = realm.objects(Workout1.self)
    for exercise in storedExercise {
        musclesName.append(exercise.exercise)
    }
    return musclesName
}

我在这方面遇到了很大的困难,非常感谢一些帮助,谢谢。

【问题讨论】:

  • 您没有将领域对象传递给您的第二个视图控制器。您正在传递一个字符串,因此它会像传递任何其他字符串一样被处理。还有,为什么prepare(forSegue里面有一个tableview委托函数didSelectRow:at

标签: ios swift realm


【解决方案1】:

然后从prepare 中获取didSelectRowAt

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    if cell == nil {
        cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
    }
    let muscle = DBHelper.shared.getWorkout()[indexPath.row]
    cell.textLabel?.text = muscle
    return cell
}


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let name = DBHelper.shared.getWorkout()[indexPath.row]
    self.performSegue(withIdentifier:"SegueName",sender:name)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let workoutDetailVC = segue.destination as! WorkoutDetail
    workoutDetailVC.receivedName = sender as! String
}

【讨论】:

  • 感谢您的回复,我已将此添加到我的代码中,它会构建并运行,但是当我尝试在模拟器中执行 segue 时,我收到错误“无法转换类型的值 'UITableViewCell ' 到 'NSString'"。
  • 这是,sender:name) 不是,sender:self)
  • 在'self.performSegue()' sn-p 中?因为这就是我在我的项目中所拥有的。我必须对您的回复做出的唯一更改是在函数的 didSelectRow 中添加“覆盖”
  • 是的,这就是我所拥有的,但我仍然收到错误,当我尝试 segue 时还有一个“线程 1:信号 SIGABRT”错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多