我在自定义单元格中有一个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/

10-14 23:40