UITextView с несколькими делегатами? - PullRequest
1 голос
/ 17 декабря 2010

У меня есть UITextView, который указывает на владельца файла в качестве его делегата, и у меня есть ряд реализованных функций делегата. Однако я также хотел бы указать на второй объект (в данном случае объект TextExpander, http://www.freshblocks.com/tutorials/how-to-add-textexpander-touch-sdk-to-iphone-apps/) также как делегат. Как это может быть возможно? Насколько я знаю, в цели может быть только один делегат -с.

Ответы [ 4 ]

3 голосов
/ 17 декабря 2010

Я не знаю специфику TextExpander, но в шаблоне разработки делегата предполагается один и только один делегат.У вас не может быть двух делегатов для одного объекта.

Есть способы обойти это.Вы можете назначить одного из делегатов основным делегатом и реализовать все методы этого класса.Затем этот класс может просто вызвать вторичный делегат для требуемых методов.Это самый простой подход, но он приводит к тому, что первичный делегат становится тесно связанным со вторичным делегатом.

Другой подход заключается в динамическом разрешении сообщений и использовании пересылки сообщений.Вам все еще потребуется шаблон первичного / вторичного делегата, но вместо основного делегата, которому нужно реализовать все методы, он просто передаст все сообщения, на которые он не отвечает, вторичному делегату.Этот подход означает, что дополнительный делегат может быть изменен путем добавления / удаления дополнительных методов делегата без необходимости изменения основного делегата.Ключевой метод - - (id)forwardingTargetForSelector:(SEL)sel.См. Пересылка сообщений Objective-C для хорошего объяснения.

1 голос
/ 17 декабря 2010

Только для информации: делегаты - это не функция Objective-C, а шаблон проектирования с использованием Cocoa / Cocoa-touch.

Шаблон делегата позволяет уведомлять только один объект об изменениях другого. Решение иметь промежуточный объект-делегат может быть простым способом выполнения действий.

Если вы хотите сохранить свой код в чистоте и уменьшить связь, вы можете использовать другой шаблон, известный как KVO (Key Value Observing). Apple предоставляет хорошее руководство о том, как его использовать.

В KVO один объект, который должен быть совместимым с KVC (Key Value Coding), может уведомлять несколько объектов, даже не зная об этом. Он использует промежуточный объект уведомлений (синглтон для вашего приложения).

Проверьте документ Apple на KVC + KVO, и вы сможете делать то, что вы хотите.

1 голос
/ 17 декабря 2010

Кажется, что они решают это на шаге 5, устанавливая [textExpander setNextDelegate:self]; перед тем, как установить объект textExpander в качестве "основного" делегата представления.

У меня самого нет кода, поэтому я его не пробовал, и их документация ... ну, нет.

0 голосов
/ 17 декабря 2010

У меня есть класс с протоколом NSXMLParserDelegate. Я называю это ParserHelper. Я анализирую множество XML, в которых есть некоторые теги, и у меня есть около 20 анализаторов (по одному для каждого типа XML), и я не хотел реализовывать его снова и снова.

Итак, я подклассифицировал свой ParserHelper класс 20 раз, добавляя в каждый подкласс необходимые теги / поведения, такие как CaseAParser, CaseBParser и так далее ...

Я просто реализовал необходимые мне методы делегата и вызвал его в суперклассе, как только закончил с методом.

Полагаю, это работает для каждого делегата.

Таким образом, все, что вам нужно, это сделать ваш класс подклассом SMTEDelegateController и реализовать необходимые вам методы, не забывая вызывать [super whatEverMethod:andParameters] в конце ваших функций, и вы должны хорошо идти.

...