从选定的单元格获取数据(TableView)

Posted

技术标签:

【中文标题】从选定的单元格获取数据(TableView)【英文标题】:Getting data from the selected cell (TableView) 【发布时间】:2017-01-18 14:45:27 【问题描述】:

我有一个包含多个数据单元格的 TableView,每个单元格中有 3 个标签。

如何使用 indexPath 将所有 3 个 label.text 保存到另一个变量中

let indexPath = self.tableView.indexPathForSelectedRow

这是完整的代码 实际上,我在另一篇文章中问过变量“limit”在 .observe 之后变为空。 所以我在想是否可以直接从单元格中获取数据。

import UIKit
import Firebase
import FirebaseDatabase

struct limitStruct
    var name : String!
    var today : String!
    var limit : String!



class CalcViewController: UITableViewController 

    var limits = [limitStruct]()
    override func viewDidLoad() 
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        navigationController?.navigationBar.barTintColor = UIColor.black
        self.title = "Calculation"
        navigationController!.navigationBar.titleTextAttributes =
            [NSForegroundColorAttributeName: UIColor.white]
        let databaseReference = FIRDatabase.database().reference()

        databaseReference.child("Limit").queryOrderedByKey().observe(.childAdded, with: 
            snapshot in
            var snapshotValue = snapshot.value as? NSDictionary

            let name = snapshotValue!["name"] as? String
            snapshotValue = snapshot.value as? NSDictionary

            let today = snapshotValue!["today"] as? String
            snapshotValue = snapshot.value as? NSDictionary

            let limit = snapshotValue!["limit"] as? String
            snapshotValue = snapshot.value as? NSDictionary


            self.limits.insert(limitStruct(name:name, today:today, limit: limit), at: self.limits.count)
            self.tableView.reloadData()
        )
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return limits.count
    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        let cell = tableView.dequeueReusableCell(withIdentifier: "Limit")

        let label1 = cell?.viewWithTag(1) as! UILabel
        label1.text = limits[indexPath.row].name

        let label2 = cell?.viewWithTag(2) as! UILabel
        label2.text = limits[indexPath.row].today

        let label3 = cell?.viewWithTag(3) as! UILabel
        label3.text = limits[indexPath.row].limit

        return cell!
    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "showDetails"

            let svc = segue.destination as! CirSliderViewController;

            if let indexPath = self.tableView.indexPathForSelectedRow
//                svc.RsegueData =
            




        
    

【问题讨论】:

显示你目前写的代码 您是如何将信息放入这些单元格的? tableView(_tableView:cellForRowAt:) 的代码是什么?您是否从数组(数据源)中设置了文本?然后,由于您检索 indexPath,只需重新排列您的数组(dataSource) @Larme 我正在从 firebase 获取数据。所以它似乎比我想象的要复杂。 你能至少显示你的代码吗? @Larme 刚刚做了 【参考方案1】:

你真的不想使用viewWithTag()。处理这个问题的最好方法是继承UITableViewCell,为你的数据模型对象添加一个属性

class LimitCell: UITableViewCell 
   var limit: Limit 
       didSet 
           // configureCell()
       
    

然后在你的视图控制器中:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

   let cell = tableView.dequeueReusableCell(withIdentifier: "Limit", forIndex: indexPath) as! LimitCell
   cell.limit = limits[indexPath.row]
   return cell


override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if let svc = segue.destination as? CirSliderViewController, cell = sender as? LimitCell 
        svc.RsegueData = cell.limit
    

【讨论】:

【参考方案2】:

您似乎正在使用回调来获取数据。数据是来自服务器还是本地存储?

1) 如果数据来自服务器,您的代码不能保证在调用func preparevar limits 已经获得数据。

2)如果数据存储在本地,并且只有limit为nil,你必须检查你是否正确地将limits[indexPath.row].limit分配给limits到单元格。(此时它是nil吗?)我认为问题出在func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) 中,其中limit 被保存。

顺便说一句,实现func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)的更实用和有效的方法是:

假设您的自定义单元格调用 LimitCell 并具有三个 UILabel:var label1var label2var label3

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCell(withIdentifier: "Limit") as! LimitCell

    cell.label1.text = limits[indexPath.row].name
    cell.label2.text = limits[indexPath.row].today
    cell.label3.text = limits[indexPath.row].limit

    return cell

【讨论】:

以上是关于从选定的单元格获取数据(TableView)的主要内容,如果未能解决你的问题,请参考以下文章

如何从表格视图中的选定单元格中获取文本?

获取页面中选定的单元格编号

如何从选定的 UICollectionView 单元格中获取数据?

从 DataGridView 选定的单元格中获取文本

如何使用 Swift 从 tableview 单元格中获取数据而不显示在标签上?

从表格小部件中的选定单元格中检索单元格数据