2

I have 2 separate textViews that I want to trigger an event when each of them are tapped. the termTextView triggers fine, but when termTextView is triggered first, the definitionTextView does not trigger when tapped. What can I do to fix this issue?

extension saveScreenViewController: UITextViewDelegate {
    func textFieldDidBeginEditing(_ textField: UITextField) {

    }
    func textViewDidBeginEditing(_ termTextView: UITextView){
        if(self.termTextView.text == "type term here..."){
        termTextView.text = ""
        termTextView.textColor = #colorLiteral(red: 0.1298420429, green: 0.1298461258, blue: 0.1298439503, alpha: 1)
        }
    }

    private func textViewDidBeginEditing2(_ definitionTextView: UITextView) {
        if(self.definitionTextView.text == "type definition here..."){
        definitionTextView.text = ""
        definitionTextView.textColor = #colorLiteral(red: 0.1298420429, green: 0.1298461258, blue: 0.1298439503, alpha: 1)
        }
    }
}

3 Answers3

3

This is not how you use UITextViewDelegate. The same delegate method is called when editing begins on any text view whose delegate is set to this target. You need to check inside it to know which text view called it.

func textViewDidBeginEditing(_ textView: UITextView) {
    if textView === termTextView {
        // do something to termTextView
    } else if textView === definitionTextView {
        // do something to definitionTextView
    } else {
        // handle other text views
    }
}
Rakesha Shastri
  • 11,053
  • 3
  • 37
  • 50
1

As Text Programming Guide for tracking multiple textFields and textViews coding suggests, it's better idea to use one delegate method to manage them instead of using separate customized delegate methods (probably except in cases you have to). You can use two different style to approach this guideline

1.Set a tag for each one of TextView and your delegate method should be look like:

func textViewDidBeginEditing(_ textView: UITextView) {
  switch texView.tag {
    case 1:
       //Handle Text View with tag 1
       return
    case 2:
       //Handle Text View with tag 1
       return
   default:
       return
   }

2.Use your defined textView object

func textViewDidBeginEditing(_ textView: UITextView) {
    if textView == termTextView {
       //Do sth to termTextView
    } else if textView == definitionTextView {
       //Do sth to definitionTextView
    }
}

In your case if you need to use multiple delegate methods, just use:

func textViewDidBeginEditing(_ definitionTextView: UITextView)

instead of:

private func textViewDidBeginEditing2(_ definitionTextView: UITextView)

I hope it helps you.

0

you need to change private func textViewDidBeginEditing2(_ definitionTextView: UITextView) to func textViewDidBeginEditing(_ definitionTextView: UITextView)

Noah Iarrobino
  • 1,435
  • 1
  • 10
  • 31