[英]Custom UITableViewCell delegate pattern in Swift
我在Swift + Objective-C問題中遇到了一個奇怪的問題。
我正在快速實現一個UITableView和一個帶有委托的自定義單元格,但是一旦UITableViewController將我的單元格委托分配給self,它就會崩潰我的應用程序和Xcode。 是的,每次我使我的應用程序崩潰時,Xcode也會崩潰,無論如何,但這是另一個問題。
這是我房間的一部分
enum NewsCellActionType: Int {
case Vote = 0
case Comments
case Time
}
protocol NewsCellDelegate {
func newsCellDidSelectButton(cell: NewsCell, actionType: NewsCellActionType)
}
class NewsCell: UITableViewCell {
var cellDelegate: NewsCellDelegate?
func selectedAction(action: NewsCellActionType) {
self.cellDelegate?.newsCellDidSelectButton(self, actionType: action)
}
}
這是我在UIViewController中設置委托的地方
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
var cell = tableView.dequeueReusableCellWithIdentifier(NewsCellsId) as NewsCell
if cell == nil {
cell = NewsCell(style: UITableViewCellStyle.Default, reuseIdentifier: NewsCellsId)
}
cell.post = self.posts[indexPath.row] as HNPost
cell.cellDelegate = self
return cell
}
它在cell.cellDelegate = self行崩潰,我不知道為什么。 是當前DP中的錯誤,還是我做錯了?
我試圖在協議的委托var + @objc標簽上使用弱函數,但是由於我使用的是純Swift枚舉,所以我不能這樣做。 但是我需要嗎?
謝謝!
我需要進行兩項更改才能使您的代碼正常工作
1.更換as
與as?
在tableView.dequeueReusableCellWithIdentifier
之后
(有關更多詳細信息,請參見Swift中的UITableView )
不需要第一次更改,因為單元格不能nil
(storyboard確保做到這一點)。 我建立了錯誤的代碼。
2.增加@class_protocol
到NewsCellDelegate
@class_protocol protocol NewsCellDelegate {
我不太確定為什么沒有該應用程序就會崩潰,我認為這是一個錯誤。 但是, @class_protocol
都應使用@class_protocol
,因為我們應該將cellDelegate
聲明為weak
@class_protocol
,如果沒有@class_protocol
我們將無法做到這一點。
weak var cellDelegate: NewsCellDelegate?
不幸的是,添加weak
函數會使使用代理時應用崩潰。
從使用ARC編寫的庫開始,您的代碼中存在大量內存泄漏,但是將其設置為MRC。
您在NewsCell
中的關閉正在捕獲self
,從而創建保留周期(以及隨后泄漏的單元)。
我無法找到崩潰的原因,但是我很確定這是編譯器/運行時的錯誤,因為它不僅使應用程序崩潰,而且使Xcode崩潰,甚至使系統崩潰了3次。
我在這里發布了答案 。
當前,如果委托應該是Objective-C類的對象(如UITableViewController),則必須使用@objc顯式標記協議:
@objc protocol SwiftProtocol
這將使與Objective-C互操作
協議NewsCellDelegate:class {func newsCellDidSelectButton(cell:NewsCell,actionType:NewsCellActionType)}
您缺少“班級”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.