从选定的单元格获取数据(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 prepare
时var 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 label1
、var label2
、var 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 单元格中获取数据?