我在自定义单元格中有一个textView,当我开始编辑时,我希望按钮出现在单元格中。为此,我创建了一个变量“ selectedIndexPathRow”,在“ textViewDidBeginEditing”函数中将textView的indexPath.row分配给该变量。
func textViewDidBeginEditing(_ textView: UITextView) {
let touchPosition:CGPoint = textView.convert(CGPoint.zero, to: self.createStoryTableView)
let indexPath = self.createStoryTableView.indexPathForRow(at: touchPosition)
self.selectedIndexPathRow = indexPath?.row ?? 0
.....
之后,在cellForRowAt中,我可以根据indexPathRow是否与变量匹配来显示或隐藏按钮。如下:
if indexPath.row == selectedIndexPathRow {
cell.inputTextView.isEditable = true
cell.createBtnStack.isHidden = false
} else {
cell.createBtnStack.isHidden = true
}
问题在于按钮仅在编辑完成后(在按Enter键或在textView外部单击时)出现,而不是在编辑开始时(或单击textView时)不同。
为了解决这个问题,我尝试了以下方法:
将tableview.reloaddata()放入'didBeginEditing'中。这将同步生成按钮,但会导致textview冻结。
如下所述,使用“ textViewShouldBeginEditing”函数尝试预先设置selectIndexPathRow变量:
func textViewShouldBeginEditing(_
textView:UITextView)-> Bool {
让touchPosition:CGPoint =
textView.convert(CGPoint.zero,至:
self.createStoryTableView)
让indexPath =
self.createStoryTableView.indexPathForRow(at:touchPosition)
self.selectedIndexPathRow = indexPath?.row ?? 0
返回真
}
但是这样做的结果并不一致-有时单击后可以直接编辑textview而没有显示任何按钮,有时可以显示按钮,但是您必须再次单击以编辑textView。
告诉我您是否有解决建议。
最佳答案
通过将单元格设置为其文本字段的委托,使单元格管理其自己的编辑状态。这是一个示例操场:
import UIKit
import PlaygroundSupport
class Cell: UITableViewCell {
let textView = UITextView()
let button = UIButton()
lazy var stackView: UIStackView = {
let stack = UIStackView(arrangedSubviews: [textView, button])
stack.translatesAutoresizingMaskIntoConstraints = false
contentView.addSubview(stack)
NSLayoutConstraint.activate([
stack.heightAnchor.constraint(equalToConstant: 120),
stack.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 12),
stack.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -12),
stack.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 12),
stack.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -12)
])
button.setTitle("Button", for: .normal)
button.addTarget(self, action: #selector(tapButton), for: .touchUpInside)
textView.delegate = self
return stack
}()
func configure() {
contentView.backgroundColor = .gray
_ = stackView
button.isHidden = !textView.isFirstResponder
}
@objc private func tapButton() {
contentView.endEditing(true)
}
}
extension Cell: UITextViewDelegate {
func textViewDidBeginEditing(_ textView: UITextView) {
button.isHidden = false
}
func textViewDidEndEditing(_ textView: UITextView) {
button.isHidden = true
}
}
class V: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(Cell.self, forCellReuseIdentifier: String(describing: Cell.self))
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: Cell.self), for: indexPath)
(cell as? Cell)?.configure()
return cell
}
}
PlaygroundPage.current.liveView = V()
关于ios - 如何在自定义单元格中选择文本 View 时同步事件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56466327/