【问题标题】:Custom UITableViewCell delegate pattern in SwiftSwift 中的自定义 UITableViewCell 委托模式
【发布时间】:2014-06-10 09:12:41
【问题描述】:

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

我正在快速实现一个 UITableView 和一个带有委托的自定义单元格,但是一旦我的 UITableViewController 将我的单元格委托分配给自己,它就会使我的应用程序和 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 的 bug,还是我做错了?

我尝试在我的委托 var + 协议上的 @objc 标记上使用弱,但由于我使用的是纯 Swift 枚举,所以我不能这样做。但我需要它吗?

谢谢!

【问题讨论】:

  • 你自己确认 'NewsCellDelegate' 协议了吗???
  • 当然可以,但我认为这是因为我的协议仅在 swift 中,并且我的类与 Objective-c 接口
  • UITableView in Swift 的可能重复项
  • 这实际上是一个已经回答的问题的副本,我猜。 asas? 的问题。
  • 不抱歉,这是关于委托和崩溃的。不是关于 UITableViewCell。这只是示例。

标签: ios uitableview delegates swift


【解决方案1】:

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

1。在tableView.dequeueReusableCellWithIdentifier之后将as替换为as?

(详情请参阅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 次它甚至让我的系统崩溃。

【讨论】:

  • 我觉得这是一个错误,因为不仅应用程序崩溃了,我的整个 Xcode 也崩溃了。
  • 第一部分你是对的,完全是我这边的一个 Swift 问题。在第二部分中,委托分配现在可以工作了,但是每当调用委托时,它仍然会使应用程序和 Xcode 崩溃(尝试单击单元格标题下的橙色按钮)。编辑:好的,看到你的编辑!
  • 这里也一样。 xCode 每次转弯都会崩溃。智能感知很糟糕。它需要时间来识别新变量。好的..它仍然是演示。
【解决方案2】:

我在这里发布了answer

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

@objc protocol SwiftProtocol

这将使与 Objective-C 的互操作成为可能

【讨论】:

  • 太糟糕了,我无法使用开箱即用的新枚举,对吧?
  • 事实上你会的。您可以继承 Objective-C 类并使用 Swift 的语言特性来增强它们。
【解决方案3】:

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

你错过了一个“类”

【讨论】:

  • 这对我来说是个问题;您是否有进一步解释这一点的参考链接?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多