问题使用Swift中的prepareForSegue方法传递自定义单元格的内容

时间:2015-11-15 15:28:04

标签: ios swift uitableview

我有一个UITableView,其中包含一个包含标签的自定义单元格。我想要的是能够在选择行时将此标签的内容传递给第二个视图控制器 我在没有自定义单元格的表格上运行的代码很好:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("reusableCell", forIndexPath: indexPath) as! CustomCell

    //labelDisplayLedQty is the name of the custom label
    cell.labelDisplayLedQty.text = inputLedQty.text

    return cell
}

以下是prepareForSegue方法中的代码。正如我所说的,如果我将它与一个不包含自定义单元格的表一起使用,这个代码可以正常工作。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    let rowIndex: NSIndexPath = tableList.indexPathForSelectedRow!
    let selectedRow: UITableViewCell = tableList.cellForRowAtIndexPath(rowIndex)!
    let contentFromSelectedRow: String = selectedRow.textLabel!.text!

    if let secondVC = segue.destinationViewController as? DriverDetailsViewController where
       segue.identifier == "segueDriverDetails" {
        secondVC.messageContentFromMainController = contentFromSelectedRow + " This message is from main viewController"
    }
}

使用上面的代码,当我选择一行时会出现以下错误,这是有道理的,因为我没有使用默认的textLabel:

fatal error: unexpectedly found nil while unwrapping an Optional value

我试过改变......

let contentFromSelectedRow: String = selectedRow.textLabel!.text!

为...

let contentFromSelectedRow: String = selectedRow.labelDisplayLedQty!.text!

但后来我收到以下提示错误消息:

Value of type 'UITableViewCell has no member labelDisplayLedQty'

有人可以告诉我,为了能够将所选行的内容传递给第二个视图控制器,我需要做些什么?

由于

4 个答案:

答案 0 :(得分:5)

您说,您使用的是自定义UITableViewCell。因此,您必须强制转换selectedRow以获得该自定义单元格的类型。试试这个:

let selectedRow = tableList.cellForRowAtIndexPath(rowIndex)! as! CustomTableViewCellName

这可让您访问自定义标签。

答案 1 :(得分:4)

问题在于这一点:

let selectedRow:UITableViewCell = tableList.cellForRowAtIndexPath(rowIndex)!
let contentFromSelectedRow:String = selectedRow.textLabel!.text!

selectedRow不应该是UITableViewCell,因为您使用的是自定义单元格

这应该解决:

let selectedRow = tableList.cellForRowAtIndexPath(rowIndex) as! CustomCell
let contentFromSelectedRow:String = selectedRow.labelDisplayLedQty.text

答案 2 :(得分:4)

由于您的表格视图单元格是自定义单元格,因此您必须转换类型

let selectedRow = tableList.cellForRowAtIndexPath(rowIndex) as! CustomCell

注意:在cellForRowAtIndexPath中呼叫prepareForSegue始终是最糟糕的选择。第一种选择是从模型(数据源数组)而不是从视图(表视图单元格)获取数据。

答案 3 :(得分:2)

首先,您会收到CustomCell的错误,但不会收到默认的单元格类错误。为什么?让我们看看你的代码:

let selectedRow: UITableViewCell = tableList.cellForRowAtIndexPath(rowIndex)!

上面的代码获取UITableViewCell类,而不是自定义类。但。您创建了一个CustomClass单元格,而不是UITableViewCell。这就是它开始变得越来越混乱的原因。首先,您必须指定您正在使用的类。但是,使用!并不是您想要的代码,我会使用if let甚至是guard语句。

guard let selectedRow = tableList.cellForRowAtIndexPath(rowIndex) as? CustomCell else {
    return
}

第二次,您现在可以使用自定义类的属性。如您所见,您无法获取属性labelDisplayLedQty,因为它不是UITableViewCell的属性。 现在您可以使用。您的自定义单元格没有textLabel属性,因此它也不会起作用。

let contentFromSelectedRow: String = selectedRow.labelDisplayLedQty!.text

第三次,我会测试你是否总是得到indexPath,因为你再次用!打开可选项。下面这行不安全(你可以使用警卫或再次使用):

let rowIndex: NSIndexPath = tableList.indexPathForSelectedRow!

上次,但并非最不重要 - 当然,您可以通过访问单元格的方式获得对数据源的访问权限 - 使用您填充单元格的数组。