使用Swift2中的“willSelectRowAtIndexPath”从单元格中获取数据

我在两周后在许多教程的帮助下尝试从TableView单元获取和segue数据.但似乎在XCode中无法做到这一点.只能获取单元格的selectedRow,但我无法读出所选单元格的文本标签.

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

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

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
}

最佳答案 如果你真的想做类似的事情,你可以这样做:

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)编程范例.在确定要传递给下一个场景的数据时,您应该返回最初填充表时使用的原始模型,而不是指表中的某些控件.

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

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,它也可以从对象中检索数据(你根本不需要实现willSelectRowAtIndexPath):

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

显然,这将取决于您的模型是什么以及您最初如何填充单元格,但希望它说明了基本的想法.

点赞