2015-12-03 59 views
1

我試圖聲明我的UITableViewCell超出了範圍,如下所示,以便大幅縮減此代碼。Downcast Instantiated UITableViewCell

但是,下面的實現返回一個錯誤(其中有箭頭),大呼小叫:

Value of type 'UITableViewCell' has no member 'friendButton'

我期待力dequeueReusableCellWithIdentifier垂頭喪氣工作。

我想刪除我的UITableViewCell超出範圍,以使所有configureCell方法和return聲明脫離控制流程。

let resultCell = userResults[indexPath.row] 

var cell: UITableViewCell! 

    if friends.contains({$0.parseObjectId == resultCell.parseObjectId}) { 
     cell = tableView.dequeueReusableCellWithIdentifier("FriendCell", forIndexPath: indexPath) as! FriendCell 
------->cell.friendButton.tag = indexPath.row 
------->cell.configureCell(resultCell) 
     return cell 
    } else if requestedFriends.contains({$0.parseObjectId == resultCell.parseObjectId}) { 
     let cell = tableView.dequeueReusableCellWithIdentifier("RequestedFriendCell", forIndexPath: indexPath) as! RequestedFriendCell 
     cell.friendButton.tag = indexPath.row 
     cell.configureCell(resultCell) 
     return cell 
    } else if incomingFriendRequests.contains({$0.objectId == resultCell.parseObjectId}) { 
     let cell = tableView.dequeueReusableCellWithIdentifier("AcceptFriendCell", forIndexPath: indexPath) as! AcceptFriendCell 
     cell.friendButton.tag = indexPath.row 
     cell.configureCell(resultCell) 
     return cell 
    } else { 
     let cell = tableView.dequeueReusableCellWithIdentifier("AddFriendCell", forIndexPath: indexPath) as! AddFriendCell 
     cell.friendButton.tag = indexPath.row 
     cell.configureCell(resultCell) 
     return cell 
    } 
+0

@ozgur放鬆。正如我所說的,實現返回一個錯誤。 'friendshipButton'已修復。 –

+0

除了'UITableViewCell'之外,你所有的單元都有一個共同的超類嗎?數組中的所有對象都有一個共同的超類嗎? – Paulw11

+0

@ Paulw11不,這些單元是'UITableViewCell'的直接子節點,但是這些數組都是相同的類型 –

回答

0

這個怎麼樣

cell = tableView.dequeueReusableCellWithIdentifier("FriendCell", forIndexPath: indexPath) as! UITableViewCell 
let friendCell = friends[indexPath.row] 
(cell as! FriendCell).friendButton.tag = indexPath.row 
+0

錯誤OP正在變得與此無關。 – ozgur

1

你不能聲明UITableViewCell類型的變量cell,然後用它作爲FriendCell

刪除第3行的var cell = ...,並在第6行的開頭添加let以使該cell成爲局部變量。

此外,你的變量名稱混淆,這是不必要的複雜的事情。沒有理由有兩個變量cellfriendCellfriendCell應該可能只被稱爲friendresultCell也一樣。

+0

我同意。爲什麼要在外部聲明單元格的麻煩*如果然後仍然有多個'return'語句? – Paulw11

+0

@ Paulw11回覆此問題,我想減少代碼量=單個返回語句 –

+0

只要沒有其他任何事情想要對單元格進行操作,而不是您已經在做的操作,則無法使其生效通過將單元格變量移動一個範圍更高來縮短。你很可能會延長它。 – fluidsonic

1

問題在於var cell被定義爲類型爲UITableViewCell

即使你出列/力鑄造FriendCell和分配給它的變種cell本身仍然是UITableViewCell型(FriendCell)的。


如果你仍然想保持if檢查外共享cell變量(和只有一個返回語句,不是很多),你將有權使用@ZHZ上述建議的代碼:

(cell as! FriendCell).friendButton.tag = indexPath.row 

...配置特定於FriendCell子類的屬性。


編輯:另一種方法是定義每個if塊內特定的子類,變量和具有爲每一個return語句。

+0

但是我仍然需要在控制流中調用'configureCell',對嗎? –

+0

任何'FriendCell'獨佔的東西都會被使用'(cell as!FriendCell)'語法來調用。 –

1

您需要將您的單元格類型轉換爲子單元格,否則父類不會檢測到子特定的函數。這是面向對象的主要概念。你必須明確地類型化子類來訪問它的功能。你應該做的是:

var cell: UITableViewCell!; 

if friends.contains({$0.parseObjectId == resultCell.parseObjectId}) { 

var friendcell : FriendCell! = tableView.dequeueReusableCellWithIdentifier("FriendCell", forIndexPath: indexPath) as! FriendCell 
     let friendCell = friends[indexPath.row] 
     friendcell.friendButton.tag = indexPath.row 
     friendcell.configureCell(friendCell) 
     cell = friendcell; 
    } 

    --------- 

    return cell; 
+0

'-tableView:cellForRowAtIndexPath:'不能返回'nil'(至少在swift中)。編譯器將不允許該代碼。 –

+0

@NicolasMiari感謝您指出。編輯我的答案 – NightFury

1

所有你的子類共享friendButton屬性和configureCell方法。

如果它們不共享一個父類,他們也許應該讓我們稱之爲超GenericCell

你可以聲明cell這樣的:

var cell: GenericCell! 

GenericCell類應該實現configureCell並有friendButton屬性,然後您可以將單元格轉換爲GenericCell並調用這些方法而沒有任何問題。