2015-10-06 61 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