如何从主 class 访问自定义集合视图单元格 class 中的文本视图

How to access text views in custom collection view cell class from the main class

我的每个集合视图单元格中都有两个文本视图,我为这些单元格定制了 class。这是代码:

class CustomWriterPageCell: UICollectionViewCell {

    fileprivate let textViewOne: UITextView = {

        let tv = UITextView()
        tv.backgroundColor = .cyan
        tv.text = "Chapter Title"
        tv.font = UIFont(name: "Avenir-Roman", size: 27)
        tv.textColor = .gray
        return tv

    }()

    fileprivate let textViewTwo: UITextView = {

        let tv = UITextView()
        tv.textColor = .gray
        tv.text = "Start your story..."
        tv.textContainerInset = UIEdgeInsets(top: 20, left: 15, bottom: 20, right: 15)
        tv.font = UIFont(name: "Avenir-Book", size: 23)
        tv.backgroundColor = .black
        return tv

    }()
}

我想在这两个文本视图中添加占位符,但问题是,由于它们是自定义的 class,据我所知,无法找出正在显示哪个文本视图已编辑,所以当 textViewDidEndEditing 发生时我无法添加相应的占位符,有没有办法找出正在编辑的文本视图?有没有办法从主 class?

访问文本视图

您始终可以访问实际的 textView 并知道在委托方法中正在编辑哪个,就像这样:

class ViewController: UIViewController {

    var textViewA: UITextView = .init()
    var textViewB: UITextView = .init()

    override func viewDidLoad() {
        super.viewDidLoad()
        textViewA.delegate = self
        textViewB.delegate = self
    }
}

extension ViewController: UITextViewDelegate {
    func textViewDidEndEditing(_ textView: UITextView) {
        switch textView {
        case textViewA:
            textView.text = "Placeholder A"
        case textViewB:
            textView.text = "Placeholder B"
        default:
            break
        }
    }
}

此外,由于 UITextView 没有任何内置的占位符机制 - 您可以使用这个不错的广告连播:https://github.com/devxoul/UITextView-Placeholder

如果您使用此 pod 并且不想创建 textView public/internal - 您可以为其创建 computedProperties:

var placeholder: String {
    get {
        return textView.placeholder
    } set {
        textView.placeholder = newValue
    }
}

在你的 CustomWriterPageCell class:

fileprivate let textViewOne: UITextView = {

    let tv = UITextView()
    tv.backgroundColor = .cyan
    tv.text = "Chapter Title"
    tv.font = UIFont(name: "Avenir-Roman", size: 27)
    tv.textColor = .gray
    return tv

}()

fileprivate let textViewTwo: UITextView = {

    let tv = UITextView()
    tv.textColor = .gray
    tv.text = "Start your story..."
    tv.textContainerInset = UIEdgeInsets(top: 20, left: 15, bottom: 20, right: 15)
    tv.font = UIFont(name: "Avenir-Book", size: 23)
    tv.backgroundColor = .black
    return tv

}()

override init(frame: CGRect) {
    super.init(frame: frame)

    textViewOne.delegate = self
    textViewTwo.delegate = self

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

然后:

extension CustomWriterPageCell : UITextViewDelegate {
      func textViewDidEndEditing(_ textView: UITextView) {

              if textView == textViewOne {
                  textView.text = "..."
              }
              else if textView == textViewTwo {
                  textView.text = "..."
              }
      }
}

这样,您的视图控制器仍然不需要知道您的文本视图。