从 UITableViewController 中的选定行获取选定的标签文本
Posted
技术标签:
【中文标题】从 UITableViewController 中的选定行获取选定的标签文本【英文标题】:Get a selected label text from a selected row in a UITableViewController 【发布时间】:2015-08-13 21:43:30 【问题描述】:我还是 Swift 新手,所以请多多包涵。
目前我已从 JSON 文件加载数据,然后将其显示到各个单元格上。
我有一个自定义单元类,它具有必要的标签出口(名称和编号)。
我想做的是在给定行上从指定的标签文本中检索数据,然后将其传递给另一个 ViewController。
例如第 3 行有两个标签,“数据”和“2004”。我选择了第 3 行,并希望获取此单元格“2004”值并将其分配给一个变量,然后该变量可以传递给不同的 ViewController。 (“2004”将被视为我的自定义单元格类中的数字标签出口,即 cell.number)
下面是一些可能有帮助的代码:
表格视图控制器
import UIKit
class TableViewController: UITableViewController, UINavigationControllerDelegate
@IBOutlet var segmentedSortOption: UISegmentedControl!
var array : NSArray = DataClass.dataStruct.jsonResult["data"] as NSArray
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
var myCell:cell = self.tableView.dequeueReusableCellWithIdentifier("cell") as cell
var upperCasedNames = array[indexPath.row]["name"] as? String
if segmentedSortOption.selectedSegmentIndex == 0
myCell.No.text = array[indexPath.row]["no"] as? String
else if segmentedSortOption.selectedSegmentIndex == 1
if let unsortedEvents = DataClass.dataStruct.jsonResult["data"] as NSArray
let descriptor = NSSortDescriptor(key: "name", ascending: true, selector: "caseInsensitiveCompare:")
let aToZ = unsortedEvents.sortedArrayUsingDescriptors([descriptor])
myCell.No.text = aToZ[indexPath.row]["no"] as? String
return myCell
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
if segue.identifier == "selectedItem"
if let indexPath = self.tableView.indexPathForSelectedRow()
let destinationController = segue.destinationViewController as ViewController
destinationController.eventData = indexPath.row as Int
自定义单元格类
import UIKit
class cell: UITableViewCell
@IBOutlet var name: UILabel!
@IBOutlet var number: UILabel!
override func awakeFromNib()
super.awakeFromNib()
// Initialization code
override func setSelected(selected: Bool, animated: Bool)
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
如果您还有其他问题,请尽管提问。
如果您有更好的选择,也请提出建议。
谢谢!
编辑:忘了提到一个关键问题。有一个分段控件,可将数据从 JSON 文件中的给定顺序重新组织为字母顺序。单元格 indexPath.row 在 A-Z 视图的实例中变得无用,因为顺序完全不同。
【问题讨论】:
【参考方案1】:在您的prepareForSegue
中,您需要获取使用cellForRowAtIndexPath
选择的单元格(与tableView(tableView: UITableView, cellForRowAtIndexPath
不同)并将其传递给destinationController
,请参见以下示例:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
if segue.identifier == "selectedItem"
if let indexPath = self.tableView.indexPathForSelectedRow()
// get the cell associated with the indexPath selected.
let cell = self.tableView.cellForRowAtIndexPath(indexPath) as cell!
// get the label text to pass to destinationController
var text1 = cell.name.text
var text2 = cell.number.text
let destinationController = segue.destinationViewController as ViewController
destinationController.eventData = indexPath.row as Int
希望对你有所帮助。
【讨论】:
非常感谢!我不敢相信它这么简单!!或多或少花了一整天的时间来解决这个问题,哈哈再次感谢维克多,非常感谢:D 很高兴为您提供帮助。阅读 Apple 的 TableView 编程指南总是一个很好的参考,即使是在 Objective-C 中的时候!!,但是你可以从指南中学到很多东西。 具有讽刺意味的是,我使用了相同的代码,但将它放在了 didSelectRowAtIndex 中,甚至没有让我觉得把它放在那里;但确实有道理。从现在开始,我一定会查看指南。再次感谢维克多 :)【参考方案2】:好的,我也是 Swift 的新手,所以请耐心等待。我看到了一些方法来做到这一点。
1) 您是从 JSON 文件将数据扔到这个 tableview 中,对吧?因此,根据您项目的结构,也许您只需单击索引(行)并使用它从 JSON 中获取相关数据。
let indexPath = tableView.indexPathForSelectedRow();
然后将该整数 indexPath 传递给您用于获取关联数据的任何 JSON 解析库。
2) 我不确定您的实现的自定义性质如何改变事情,但可能this more generic question 有您的答案。
3) 更多的是 hack-y 解决方案,但也许当您填充此 UITableView 时,您可以将每个单元格的标签设置为其索引,然后您可以通过标签获取它并以这种方式检索其标签值(比如在this SO answer)?
【讨论】:
感谢您的输入,但我最初使用的是您的第一个建议,但在新的 A-Z 排序之后,它使该功能变得多余。我还检查了第一个链接,因为我使用的是自定义单元格类,所以没有帮助,但是第二个链接看起来在不久的将来会派上用场。谢谢:) 当然,抱歉,我没有完全阅读/理解您的问题:) 无论如何祝您好运!如果您按照我的第三个想法提出解决方案,请随时建议代码作为答案的编辑,我会整合它。以上是关于从 UITableViewController 中的选定行获取选定的标签文本的主要内容,如果未能解决你的问题,请参考以下文章
如何从另一个 ViewController 中选择 UITableViewController 行?
从 UITableViewController 继承的控制器中的自定义 uitableViewCell
如何从 UITableViewController 中的静态单元格获取 textFields?迅速
尝试从 UITableViewController 文本框将数据保存在核心数据中