Swift中的自定义UITableViewCell委托模式

时间:2014-06-10 09:12:41

标签: ios uitableview delegates swift

我在Swift + Objective-C问题上遇到了一个奇怪的问题。

我在swift中实现了一个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枚举时,我无法做到这一点。但我需要吗?

谢谢!

3 个答案:

答案 0 :(得分:4)

我需要进行两项更改才能使代码正常工作

<德尔> 1。在as

之后将as?替换为tableView.dequeueReusableCellWithIdentifier

(有关详细信息,请参阅UITableView in Swift

第一次更改不需要,因为单元格不能是nil(故事板确保它)。我已经错误地构建了代码。

2。已将@class_protocol添加到NewsCellDelegate

@class_protocol protocol NewsCellDelegate {

我不确定为什么应用程序在没有它的情况下崩溃,我认为这是一个错误。但是,无论如何都应该使用@class_protocol,因为我们应该将cellDelegate声明为weak而没有@class_protocol我们无法做到。

weak var cellDelegate: NewsCellDelegate?

不幸的是,添加weak会在使用委托时导致应用程序崩溃。

您的代码中存在大量内存泄漏,从库开始,该库使用ARC编写,但设置为MRC。

NewsCell中的关闭正在捕获self,创建保留周期(以及随后泄露的单元格)。

我无法找到崩溃的原因,但我很确定它是编译器/运行时中的一个错误,因为它不仅会破坏应用程序,而且还会破坏Xcode,甚至会使系统崩溃3次。< / p>

答案 1 :(得分:4)

我在这里发布了answer

  

目前,如果委托应该是Objective-C类的Object(如UITableViewController),则必须使用@objc显式标记协议:

@objc protocol SwiftProtocol

这将实现与Objective-C的互操作

答案 2 :(得分:2)

协议NewsCellDelegate:class {     func newsCellDidSelectButton(cell:NewsCell,actionType:NewsCellActionType) }

你错过了一个&#34;类&#34;