我在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枚举时,我无法做到这一点。但我需要吗?
谢谢!
答案 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;