如果已声明变量,则在向下转换后swift变量类型不会更改?

时间:2015-10-06 18:00:41

标签: ios swift uitableview variables downcast

我打算根据它所在的部分将UITableViewCell转发到不同的子类。

假设UITableViewCell的子类为CellOne且它有一个var nameLabel。在一种情况下,我将dequeueReusableCellWithIdentifier(_:_:)返回的{UITableViewCell'转发({!}}并CellOne并将其分配给cell,这是在交换机块之外声明为var cell = UITableViewCell()的变量。

但在此之后,cell无法访问nameLabel实例持有的CellOne。我收到错误消息:“类型'UITableViewCell'的值没有成员nameLabel”。

所以似乎cell没有被下载到UITableViewCell的子类。

cell是否可以访问nameLabel(在块外宣布之后)?通过在声明变量之后为其分配子类实例,可以将变量降级为另一种类型吗?

非常感谢你的时间。


这是我的代码:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = UITableViewCell()

    switch indexPath.section {
    case 0:
        cell = tableView.dequeueReusableCellWithIdentifier("cellOne", forIndexPath: indexPath) as! CellOne
        cell.nameLabel.text = "one" // Error: Value of type 'UITableViewCell' has no member 'nameLabel'
    case 1:
        cell = tableView.dequeueReusableCellWithIdentifier("cellTwo", forIndexPath: indexPath) as! CellTwo
    ...... // Other cases
    }

    return cell
}

CellOne的代码:

class CellOne: UITableViewCell {
    @IBOutlet weak var nameLabel: UILabel!
    ......
}

2 个答案:

答案 0 :(得分:0)

问题在于您声明变量cell您明确表示其为UITableViewCell,因此您将有问题将其转发为yourCustomCell

改变这个:

  var cell = UITableViewCell()
  

根据您的评论,您想要使用多个自定义单元格

我认为您应该在案件代码区块中声明这些海关单元

 switch indexPath.section 
{
  case 0:
    let cell = tableView.dequeueReusableCellWithIdentifier("cellOne", forIndexPath: indexPath) as! CellOne
      cell.nameLabel.text = "one"
  case 1:
     let secondCell = tableView.dequeueReusableCellWithIdentifier("cellTwo", forIndexPath: indexPath) as! CellTwo
       // do whatever you want 
}

答案 1 :(得分:0)

我觉得最好让你的细胞更通用,因为它们可以在多个部分中使用#39;。即。而不是' CellOne'创建您的单元格' NameCell'可以在表格的所有部分使用。

细胞应该是可重复使用的。

let nameCell = tableView.dequeueReusableCellWithIdentifier("nameCell") as! NameCell

switch indexPath.section{
case 0: 
  nameCell.nameLabel.text = "name1"
break
case 1:
  nameCell.nameLabel.text = "name2"
break
...
default:
  ...
}