[英]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.