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

蹲街弑〆低调 提交于 2019-12-25 01:49:22

问题


I've got two text views in each of my collection view cells, I've made a custom class for the cells. here is the code:

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

    }()
}

I would like to add placeholders to both these text views but the problem is that since they are in a custom class there is no way, that I know of, to find out which text view is being edited so I can't add the respective placeholders back when textViewDidEndEditing takes place, is there a way to find out which text view is being edited? Is there a way to access the text views from the main class?


回答1:


In your 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")
    }
}

Then:

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

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

This way, your View Controller still does not need to know about your text views.




回答2:


You can always access the actual textView and know which one is being edited in delegate methods, just like this:

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
        }
    }
}

Also, because of the fact that UITextView doesn't have any built-in placeholder mechanism - you could use this nice pod: https://github.com/devxoul/UITextView-Placeholder

If you use this pod and don't want to make textViews public/internal - you can create computedProperties for it:

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


来源:https://stackoverflow.com/questions/57977396/how-to-access-text-views-in-custom-collection-view-cell-class-from-the-main-clas

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!