2016-12-21 3 views
2

Попытка создания пользовательских классов делегатов для UITextViewDelegate и UITextFieldDelegate. Когда я устанавливаю эти классы в качестве своего делегата или устанавливаю другой компонент UIKit в качестве своего делегата, все работает нормально. Однако, если я создаю свой собственный класс для работы в качестве делегата, методы делегата никогда не вызываются. Зачем?Пользовательский UITextViewDelegate/UITextFieldDelegate не называется

Это работает:

class MyTextView: UITextView, UITextViewDelegate { 
    required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    self.delegate = self 
} 

func textViewDidChange(_ textView: UITextView) { 
    print("I work") 
} 

Это не:

class MyTextView: UITextView { 
    required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    self.delegate = MyDelegate() 
} 

class MyDelegate: NSObject, UITextViewDelegate { 
    func textViewDidChange(_ textView: UITextView) { 
    print("I work") 
    } 
} 

Примечание: Если MyDelegate не подкласс NSObject, брошено следующее сообщение об ошибке:

/// Type 'MyDelegate' does not conform to protocol 'NSObjectProtocol'

+2

Привет, вам нужно оставить ссылку на класс MyDelegate, или он получит dealloc. – koropok

+0

#Facepalm! Я просто столкнулся с этой проблемой с другим классом. Это даст вам выстрел; благодаря! – AnthonyW

+0

@ koropok Оглядываясь на него, не должно ли поле 'delegate' содержать ссылку на MyDelegate? – AnthonyW

ответ

2

, когда вы устанавливаете делегат текстового поля во втором случае, вы создаете слабую ссылку класса MyDelegate(). Вы можете проверить следующий код, это решит вашу проблему, создав сильную ссылку MyDelegate().

class MyTextView: UITextView { 
    var responseDelegate = MyDelegate() 
    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     self.delegate = responseDelegate 
    } 
} 
class MyDelegate: NSObject, UITextViewDelegate { 
    func textViewDidChange(_ textView: UITextView) { 
     print("I work") 
    } 
} 

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

  • Нет связанных вопросов^_^