在我的 TextViewTableViewCell
中,我有一个用于跟踪 block 的变量和一个用于传入和分配 block 的配置方法。
这是我的 TextViewTableViewCell
类:
//
// TextViewTableViewCell.swift
//
import UIKit
class TextViewTableViewCell: UITableViewCell, UITextViewDelegate {
@IBOutlet var textView : UITextView
var onTextViewEditClosure : ((text : String) -> Void)?
func configure(#text: String?, onTextEdit : ((text : String) -> Void)) {
onTextViewEditClosure = onTextEdit
textView.delegate = self
textView.text = text
}
// #pragma mark - Text View Delegate
func textViewDidEndEditing(textView: UITextView!) {
if onTextViewEditClosure {
onTextViewEditClosure!(text: textView.text)
}
}
}
当我在 cellForRowAtIndexPath
方法中使用 configure 方法时,如何在传入的 block 中正确使用 weak self。
这是没有弱 self 的我所拥有的:
let myCell = tableView.dequeueReusableCellWithIdentifier(textViewCellIdenfitier) as TextViewTableViewCell
myCell.configure(text: body, onTextEdit: {(text: String) in
// THIS SELF NEEDS TO BE WEAK
self.body = text
})
cell = bodyCell
更新:我使用[weak self]
得到了以下结果:
let myCell = tableView.dequeueReusableCellWithIdentifier(textViewCellIdenfitier) as TextViewTableViewCell
myCell.configure(text: body, onTextEdit: {[weak self] (text: String) in
if let strongSelf = self {
strongSelf.body = text
}
})
cell = myCell
当我执行 [unowned self]
而不是 [weak self]
并取出 if
语句时,应用程序崩溃了。关于如何使用 [unowned self]
有什么想法吗?
最佳答案
如果 self 在闭包中可以为 nil,则使用 [weak self]。
如果 self 在闭包中永远不会为 nil,则使用 [unowned self]。
如果它在你使用 [unowned self] 时崩溃,我猜 self 在那个闭包的某个时刻是 nil,这就是为什么你必须使用 [weak self] 代替。
我真的很喜欢手册中关于在闭包中使用strong、weak 和unowned 的整个部分:
注意:我使用的术语是 closure 而不是 block 这是较新的 Swift 术语:
Difference between block (Objective C) and closure (Swift) in ios
关于ios - 如何正确处理带有参数的 Swift block 中的 Weak Self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24468336/