2015-07-28 5 views
0

У меня есть три разных текстовых поля, в которых мне нужно использовать 3 разных метода «textViewDidChange». Объединение их в одну функцию не работает для меня. Я - это три разных действия, которые могут влиять друг на друга. Поэтому я пытаюсь сделать три различные функции, как показано ниже. Но я получаю ошибку «недопустимое повторное объявление». Как я могу это понять?Недопустимое переопределение «textViewDidChange» Swift

func textViewDidChange(messageTxt1: UITextView) { 

    var len = count(messageTxt.text.utf16) 

    var diff = 90 - len 

    if diff < 0 { 

     charsLbl.textColor = UIColor.redColor() 
    } else { 

     charsLbl.textColor = UIColor.blackColor() 
    } 

    charsLbl.text = "\(diff) chars left" 

} 


func textViewDidChange (messageTxt2: UITextView) { 

    refreshResults() 

    var len2 = count(messageTxt2.text.utf16) 

    if len2 > 3 { 

     println("search") 

    } 

    else 

    { 

     resultsTable.hidden = true 

    } 

    var diff2 = 30 - len2 

    if diff2 < 0 { 

     charsLbl2.textColor = UIColor.redColor() 
    } else { 

     charsLbl2.textColor = UIColor.blackColor() 
    } 

    charsLbl2.text = "\(diff2) chars left" 


} 


func textViewDidChange (messageTxt3: UITextView) { 


    var len3 = count(messageTxt3.text.utf16) 

    var diff3 = 30 - len3 

    if diff3 < 0 { 

     charsLbl3.textColor = UIColor.redColor() 
    } else { 

     charsLbl3.textColor = UIColor.blackColor() 
    } 

    charsLbl3.text = "\(diff3) chars left" 


} 

ответ

0
  1. Вы создаете три метода с тем же именем textViewDidChange.
  2. В вашем случае используйте свойство tag и определите только один метод для всех.

Пример

let textView1 = UITextView() 
textView1.tag = 1 

let textView2 = UITextView() 
textView2.tag = 2 

let textView3 = UITextView() 
textView3.tag = 3 

In method just add condition for that. 

func textViewDidChange (messageTxt: UITextView) { 

if messageTxt.tag == 1 
{ 
    // Your code for textview 1 
} 
else if messageTxt.tag == 2 
{ 
     // Your code for textview 2 
} 
else if messageTxt.tag == 3 
{ 
    // Your code for textview 3 
}} 
+0

Зачем использовать тег, когда вы можете напрямую сравнивать объекты? 'messageTxt === textView1' делает то, что вы ожидаете. – Fantattitude

+0

@Fantattitude вы должны поддерживать ссылку для этого. – iDhaval

+0

У меня больше смысла держать ссылки, это меньше подвержено ошибкам, чем просто использовать тег с «волшебными» числами. – Fantattitude

1

Это просто невозможно, потому что каждый textViewDidChange: метод принимает одни и те же типы в качестве параметра (имя переменной внутри области видимости функции не играет роли здесь).

Один из способов разобраться с несколькими функциями будет иметь один textViewDidChange: метод и использовать его как способ вызывать другие функции, как это:

func textViewDidChange(textView: UITextView) { 
    switch textView { 
    case textView1: 
     textViewDidChange1() 
     break 
    case textView2: 
     textViewDidChange2() 
     break 
    case textView3: 
     textViewDidChange3() 
     break 
    default: 
     print("Shouldn't happen") 
     break 
    } 
} 

func textViewDidChange1() { 
    // Do something 
} 

func textViewDidChange2() { 
    // Do something 
} 

func textViewDidChange3() { 
    // Do something 
} 

textView1, textView2 и textView3 будучи Outlets к вашему UITextViews , Это выглядит немного излишним для меня, но он работает.

+0

Спасибо Fantattitude! Это решило мою проблему. Отличное решение. – saner

Смежные вопросы