簡體   English   中英

Swift中的自定義UITableViewCell委托模式

[英]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.更換asas? tableView.dequeueReusableCellWithIdentifier之后

(有關更多詳細信息,請參見Swift中的UITableView

不需要第一次更改,因為單元格不能nil (storyboard確保做到這一點)。 我建立了錯誤的代碼。

2.增加@class_protocolNewsCellDelegate

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM