iOS开发:使用Parse Swift实现TableView单元格数据传值到VC
实现TableView单元格点击跳转并传递Parse数据到新视图控制器
嘿,既然你已经把Parse的数据稳稳展示在TableView里了,那搞定点击单元格跳转到详情页并传值这事简直手到擒来,分两步就能搞定:
第一步:给TableView添加点击事件处理
你只需要实现TableView的didSelectRowAt代理方法,在里面拿到点击行的数据,然后传给目标视图控制器就行。直接把这段代码加到你的TableView所在VC里:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // 先取消单元格的选中状态,用户体验更友好 tableView.deselectRow(at: indexPath, animated: true) // 获取当前点击行对应的Parse数据对象 let selectedGood = data[indexPath.row] // 实例化你的详情页VC,这里假设你用Storyboard创建的VC,标识符是"DetailVC" guard let detailVC = storyboard?.instantiateViewController(withIdentifier: "DetailVC") as? DetailViewController else { print("无法实例化详情页VC") return } // 把选中的数据传递给详情页VC detailVC.selectedGood = selectedGood // 跳转页面,如果你的VC在导航栏里就用push,否则用present navigationController?.pushViewController(detailVC, animated: true) // present(detailVC, animated: true) }
第二步:在详情页VC里接收并使用数据
接下来在你的目标详情页VC里,先定义一个变量来接收传递过来的Parse对象,然后在viewDidLoad里就能用这些数据填充页面了:
import UIKit import Parse class DetailViewController: UIViewController { // 定义变量用来接收传递的Parse数据 var selectedGood: PFObject? // 假设你详情页有这些控件,记得和Storyboard关联好 @IBOutlet weak var userNameLabel: UILabel! @IBOutlet weak var areaLabel: UILabel! @IBOutlet weak var descriptionLabel: UILabel! @IBOutlet weak var priorityLabel: UILabel! @IBOutlet weak var problemImageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() // 校验数据是否存在,然后填充页面 guard let good = selectedGood else { return } // 填充文本数据 let name = good["username"] as! String userNameLabel.text = "@\(name)" let area = good["place"] as! String areaLabel.text = area descriptionLabel.text = good["description"] as? String if let priority = good["priority"] as? Int { priorityLabel.text = "Priority \(priority)" } // 加载图片 if let imageFile = good["image"] as? PFFile { imageFile.getDataInBackground { [weak self] (imageData, error) in guard let self = self, let data = imageData, error == nil else { return } self.problemImageView.image = UIImage(data: data) } } } }
额外小提示
- 别忘了确保你的TableView已经设置了
delegate,比如在当前VC的viewDidLoad里加一句:tableView.delegate = self - 如果你习惯用Storyboard的Segue跳转(而不是手动push),可以改用
prepare(for:sender:)方法:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "ShowDetailSegue" { // 获取当前选中的行 guard let indexPath = tableView.indexPathForSelectedRow else { return } let selectedGood = data[indexPath.row] // 传递数据给目标VC let detailVC = segue.destination as! DetailViewController detailVC.selectedGood = selectedGood } }
这种方式需要你在Storyboard里给单元格和详情页VC之间拖一个Show类型的Segue,并设置标识符为ShowDetailSegue。
内容的提问来源于stack exchange,提问作者Best Moments
相关产品推荐
相关产品推荐

