2015-10-06 94 views
0

我意欲基于它是英寸如果声明了变量,swift变量类型在downcast后不会改变?

假设的UITableViewCell的子类是CellOne,它有一个其var nameLabel部向下转换到一个UITableViewCell到不同的子类。在一种情况下,我倒下(如!)由dequeueReusableCellWithIdentifier(_:_:)返回到CellOne的UITableViewCell,并将其分配给cell,在变换块外部声明为var cell = UITableViewCell()的变量。

但是之后,cell无法访问nameLabelCellOne实例。我收到错误消息:“类型'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! 
    ...... 
} 

回答

0

的问题是,你声明的变量cell可以明确地说,它的一个UITableViewCell,所以你会有问题以downcast作为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 
} 
+0

嗨拉穆尔,谢谢你的回答!我没有将'cell'声明为'CellOne',因为它可能会根据它所在的部分被降频到UITableViewCell的其他子类(如CellTwo,CellThree ...)。所以我无法将其声明为'CellOne ”。我会编辑这个问题,使其更清晰。 – ninikikki

+0

所以如果你正在使用其他自定义单元格,你应该只在同一个代码块中声明 – Lamar

+0

我不想重复“return cell”多次。但我想我没有其他选择=)非常感谢! – ninikikki

0

我觉得最好让你的单元格更具通用性,以便他们可以在多个“部分”中工作。即。而不是'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: 
    ... 
} 
+0

嗨JoshR604,谢谢!我希望不同部分的单元格有不同的样式和元素,所以我想为它分配不同的子类。 – ninikikki