【问题标题】:Get data from a cell with "willSelectRowAtIndexPath" in Swift2在 Swift 2 中使用“didSelectRowAt IndexPath”从单元格中获取数据
【发布时间】:2015-08-23 16:40:37
【问题描述】:

两周以来,我一直在尝试在许多教程的帮助下从 TableView 单元格中获取和分离数据。但在 XCode 中似乎不可能做到这一点。只能获取单元格的 selectedRow,但无法读出所选单元格的 Text 标签。

如果用户选择了一个单元格,我想将所选单元格中的标签值设置为新的视图控制器。

我只能将选定的行提交到新的视图控制器,但不能提交此选定单元格中标签的值。

func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {
   row = indexPath.row // here is the row the user has selcted
    labelStringOfselectedCell = "??????" // how to retrieve data from a label in the cell?
    return indexPath
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let DestViewController : ViewControllerDetail = segue.destinationViewController as! ViewControllerDetail
    DestViewController.seguedData = labelStringOfselectedCell
}

【问题讨论】:

    标签: swift uitableview cell


    【解决方案1】:

    如果你真的想做这样的事情,你可以这样做:

    func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {
        let cell = tableView.cellForRowAtIndexPath(indexPath)  // do not confuse this with the similarly named `tableView:cellForRowAtIndexPath:` method that you've implemented
        let string = cell?.textLabel?.text
        return indexPath
    }
    

    显然,这取决于您是否是自定义单元子类以及标签是什么,但这说明了基本思想。

    话虽如此,你不应该这样做。你的应用应该遵循Model-View-Controller (MVC) 编程范式。在确定将哪些数据传递给下一个场景时,您应该回到最初填充表格时使用的原始模型,而不是引用表格中的某些控件。

    例如,假设您通过从 objects 模型中检索数据来填充原始单元格:

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 
        let object = objects[indexPath.row]
        cell.textLabel?.text = object.name
        return cell
    }
    

    然后您只需实现一个prepareForSegue,它也从objects 检索数据(并且您根本不必实现willSelectRowAtIndexPath):

    func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let destination = segue.destinationViewController as? ViewControllerDetail {
            let object = objects[tableView.indexPathForSelectedRow!.row]
            destination.seguedData = object.name
        }
    }
    

    显然,这将根据您的模型是什么以及您最初填充单元格的方式而改变,但希望它能说明基本思想。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多