Как мне использовать общие методы между контроллерами представления в Objective-C? - PullRequest
2 голосов
/ 27 марта 2011

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

Есть ли способ поделиться кодом этих распространенных методов? Я вижу две возможности:

1) либо одна копия кода, действительно разделенная в памяти, как в специальном объекте обслуживания методов

или

2) записывается один раз в блок кода, но распределяется много раз по мере необходимости для каждого представления.

Какой из них является правильным путем или каков правильный путь, и КАК он будет реализован наиболее простым способом?

Доброта, новый кодер в комнате.

Спасибо.

-Ric

Ответы [ 4 ]

11 голосов
/ 27 марта 2011

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

Лучший способ достичь того, что вы хотите, - это создать общий родительский класс для контроллеров представления.Таким образом, вместо того чтобы наследовать непосредственно от UIViewController, каждый из ваших пользовательских классов будет наследовать от SomeFeatureViewController (где SomeFeature описывает предоставленную общую функцию), этот класс наследует от UIViewController.Теперь каждый из ваших реальных контроллеров представления будет наследоваться от SomeFeatureViewController, и любые общие методы (также любые общие переменные экземпляра, используемые этими методами) могут быть помещены в этот родительский класс.

@interface SomeFeatureViewController : UIViewController
{
    int common_iVars;
}
- (void)commonMethods;
@end

@interface ActualViewController : SomeFeatureViewController
{
    int specific_iVars;
}
- (void)specificMethods;
@end
0 голосов
/ 03 мая 2011

Что я в итоге сделал, так это создал объект Singleton и разместил там все свои обычные методы. Это означало, что все мои контроллеры представления могли использовать общие методы Singleton. Может быть, это немного слишком открыто, если проект разрабатывался командой программистов, но, поскольку это только я, я знаю, что все контроллеры имеют схожие требования в обработке. Таким образом, подход синглтона, похоже, сработал.

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

0 голосов
/ 27 марта 2011

Как сказал jhabbott, подкласс UIViewController - это хорошее решение.

Если это не вариант (например, вы не можете изменить иерархию классов), другой вариант - создать категорию в UIViewController, чтобы добавить необходимые методы и свойства. Это сделает ваши методы доступными на каждом UIViewController, включая все стандартные подклассы, без дополнительной работы с вашей стороны. С помощью этого решения вы не можете напрямую добавлять ivars, хотя вы можете подделать его достаточно хорошо, используя ассоциативные ссылки .

0 голосов
/ 27 марта 2011

На мой взгляд, вы должны создать класс со всеми распространенными методами, а затем создать его подкласс.Скажем, у вас есть MyCommonViewController: UIViewController, а затем для каждого отдельного контроллера представления выполните MySpecificVIewController: MyCommonViewController

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...