Swift开发:TableViewCell中TextView作为拖拽源时无法引用问题
解决TableViewCell中TextView无法在ViewController引用的问题
我明白你的困扰——想给cell里的TextView加拖拽交互,但没法直接在VC里拿到它的引用,还不能用IBOutlet。其实不用纠结在VC里操作,咱们换个思路,从自定义cell本身入手就可以搞定:
方案1:让自定义Cell自己处理拖拽交互
既然TextView是属于TableViewCell的,那直接在TableViewCell.swift里给它添加拖拽交互就好了,完全不用VC插手。比如在cell的初始化方法或者awakeFromNib里操作:
class TableViewCell: UITableViewCell { @IBOutlet weak var label: UILabel! private var textView: UITextView! override func awakeFromNib() { super.awakeFromNib() // 方法1:给TextView设置tag(在xib里给TextView设置tag为100) textView = contentView.viewWithTag(100) as? UITextView // 方法2:如果是代码创建的TextView,直接在这里初始化 // textView = UITextView(frame: CGRect(x: 0, y: 0, width: contentView.bounds.width, height: 100)) // contentView.addSubview(textView) // 添加拖拽交互 let dragInteraction = UIDragInteraction(delegate: self) textView.addInteraction(dragInteraction) } } // 让Cell遵守UIDragInteractionDelegate协议,实现必要的方法 extension TableViewCell: UIDragInteractionDelegate { func dragInteraction(_ interaction: UIDragInteraction, itemsForBeginning session: UIDragSession) -> [UIDragItem] { guard let text = textView.text else { return [] } let itemProvider = NSItemProvider(object: text as NSString) return [UIDragItem(itemProvider: itemProvider)] } }
这样一来,每个cell创建的时候,自己的TextView就会带上拖拽交互,VC里不用做任何额外操作。
方案2:给Cell添加只读属性暴露TextView
如果你一定要在VC里处理拖拽逻辑,那可以给自定义Cell加一个只读的计算属性,用来获取TextView的引用,不用IBOutlet:
class TableViewCell: UITableViewCell { @IBOutlet weak var label: UILabel! // 暴露TextView的只读属性 var cellTextView: UITextView? { // 同样用tag获取,记得在xib里给TextView设置对应tag return contentView.viewWithTag(100) as? UITextView } }
然后在VC的cellForRowAt方法里,拿到cell后就可以访问这个属性了:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell // 添加拖拽交互 if let textView = cell.cellTextView { let dragInteraction = UIDragInteraction(delegate: self) textView.addInteraction(dragInteraction) } return cell }
记得让VC也遵守UIDragInteractionDelegate协议,实现对应的拖拽方法。
这两个方案都能避开不能用IBOutlet的限制,推荐第一个方案,因为逻辑更内聚,cell自己管理自己的交互,代码更清晰。
内容的提问来源于stack exchange,提问作者Podenko
相关产品推荐
相关产品推荐

