Это довольно сложная иерархия наследования, так что нести меня (я попытался упростить ситуацию, а не указать точный случай, который я использую, что еще сложнее): -Objective-C - Подкласс делегата в подклассе
Предположим, я создаю подкласс UITextField
под названием TextField
, который является моим собственным пользовательским расширенным текстовым полем общего назначения. Теперь, чтобы обеспечить эту расширенную функциональность, в методе от TextField
, я установил super.delegate = self
, чтобы все методы делегата от UITextField
отправлены в TextField
. TextField
реализует протокол UITextFieldDelegate
и получает эти методы делегатов, чтобы сделать что-то интересное.
Однако, в свою очередь, я хочу сделать так, чтобы TextField
имеет делегат. Поэтому я создаю новый протокол под названием TextFieldDelegate
(обратите внимание на отсутствие UI
-prefix!) И дайте TextField
ivar id<TextFieldDelegate> __weak delegate
с соответствующим свойством, чтобы другие классы могли получать методы делегатов от TextField
.
Надеюсь, вы все еще со мной, потому что до сих пор я не делал ничего слишком сложного. Но скажем, что теперь я создаю еще один пользовательский подкласс TextField
, назовем его PasswordTextField
(в реальной жизни, вероятно, не нужно будет создавать подкласс только для реализации функций пароля, но предположим, что существует довольно сложная реализация что потребует этого).
Предположим также, что я хочу сделать так, чтобы PasswordTextField
(который, как и TextField
имеет свойство делегата), может отправлять расширенный набор методов делегатов. Например, возможно, он может отправить метод passwordIsSecure
, который отправляется после того, как пароль достигнет требуемого уровня сложности. Теперь, поскольку это поведение не было найдено в регулярном TextField
, я создаю новый протокол: PasswordTextFieldDelegate <TextFieldDelegate>
, который определяет новые методы делегирования для PasswordTextField
и наследует все методы делегатов, отправленные TextField
.
Проблема в следующем: как это реализовать в PasswordTextField
? Вещи, которые не работают:
Наследование
Я не могу просто наследовать делегата от TextField
, потому что делегат TextField
«s соответствует только к TextFieldDelegate
и не PasswordTextFieldDelegate
, поэтому я не могу отправить методы, как [delegate passwordIsSecure]
, потому что TextFieldDelegate
не имеет такого метода.
Перекрытия Ивар
Я мог бы попробовать объявляя Ивар в PasswordTextField
называемого делегатом, но компилятор жалуется, что это дубликат декларации, потому что, конечно, уже есть Ивар называется делегатом суперкласса, так что не работает *.
Изменение суперкласс
я мог вернуться к TextField
класс и переопределить делегата реализовать оба TextFieldDelegate
иPasswordTextFieldDelegate
, но это кажется грязным и говорит TextField
, что он может послать PasswordTextFieldDelegate
методы, которые из Конечно, это невозможно!
Я не пробовал этот, просто потому, что он, похоже, нарушает все разумные правила кодирования в книге.
Таким образом, должен быть какой-то способ сделать это, чтобы подкласс класса мог иметь собственный делегат, который является суб-делегатом делегата суперкласса и для всего этого хорошо сочетается, но я просто могу Не понимаю! Есть идеи?
(* В качестве побочного вопроса, я не понимаю, почему компилятор жалуется, когда PasswordTextField
объявляет «дубликат» Ивар имени делегата, но не жалуется, когда TextField
объявляет Ивар именем делегата, который предположительно является дубликатом UITextField
's свойство, называемое делегатом!)
может быть им просто ударить в темноте .. но разве это не поможет, если вы просто повторно объявите @property вашего делегата как id и у вас есть собственный синтез? Я думаю, это сработает. mebbe плохо дать ему попробовать через некоторое время –
govi