如何在Swift中正确转换为子类?

时间:2014-10-18 10:48:23

标签: ios uitableview swift

我有一个UITableView,其中包含许多不同的单元格,基于数据源内容数组中的内容,它们应该显示自定义内容。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell : UITableViewCell? = nil
        let objectAtIndexPath: AnyObject = contentArray![indexPath.row]

        if let questionText = objectAtIndexPath as? String {
            cell = tableView.dequeueReusableCellWithIdentifier("questionCell", forIndexPath: indexPath) as QuestionTableViewCell
            cell.customLabel.text = "test"
        }

        return cell!
    }

我在这里得到错误

UITableViewCell does not have the attribute customLabel

QuestionTableViewCell确实有。我的演员阵容错误到了QuestionTableViewCell

3 个答案:

答案 0 :(得分:24)

问题不是你的演员而是你的cell声明。您将其声明为可选的UITableViewCell,并且该声明永远存在 - 并且是编译器所知道的全部内容。

因此,您必须在呼叫时将投射到customLabel。而不是:

cell.customLabel.text = "test"

你需要这个:

(cell as QuestionTableViewCell).customLabel.text = "test"

你可以通过声明一个不同的变量来让自己变得更容易(因为你知道在这种特殊情况下你的单元格将是一个QuestionTableViewCell),但只要你只有一个变量,cell,你将不得不经常把它投射到你认为它真正的类。就个人而言,我会写更多这样的东西,完全是为了避免重复演员:

    if let questionText = objectAtIndexPath as? String {
        let qtv = tableView.dequeueReusableCellWithIdentifier("questionCell", forIndexPath: indexPath) as QuestionTableViewCell
        qtv.customLabel.text = "test"
        cell = qtv
    }

答案 1 :(得分:1)

问题在于var cell : UITableViewCell? = nil。您将其声明为UITableViewCell?,并且它永远具有该类型。

您可以声明另一个变量

let questionCell = cell as! QuestionTableViewCell
questionCell.customLabel.text = "test"

答案 2 :(得分:-5)

您可以执行以下任一操作:

  1. 替换:cell.customLabel.text = "test"

    cell?.customLabel.text = "text1"
    
  2. var cell : UITableView? = nil更改为var cell : UITableView!