繁体   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