从 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 文本框将数据保存在核心数据中

从 URL 字符串中提取的 UITableViewController 中的图像加载缓慢

从 UIViewController 转到 UITableViewController