iOS: обработка UIGestureRecognisers в представлениях UI (Sub) - PullRequest
2 голосов
/ 14 июля 2011

Я хотел бы знать, как наилучшим образом решить следующую проблему:

У меня есть один ViewController.Его вид содержит множество сложных подпредставлений (подкласс UIView).Из-за сложности некоторые из этих UIViews инициализируют свои собственные UIGestureRecognisers и реализуют соответствующие целевые действия.Поскольку я хочу координировать жесты различных подпредставлений, я должен установить один раз ViewController в качестве делегата жеста.Для этого есть различные возможности.

1) Инициализировать ВСЕ жесты в viewController (это приведет к массивному viewController)

2) определение протокола в UIVIews (getViewController), реализованос помощью ViewController

@protocol CustomViewDelegate <NSObject>
@required
- (UIViewController *)getViewController;
@end

3) настроить метод init UIViews и использовать ViewController в качестве опции.

- (id)initWithFrame:(CGRect)frame andViewController:(UIViewController *)vc;

Какая самая элегантная возможность решить эту проблему?Можно ли реализовать целевые действия внутри объекта UIView?

Спасибо за ваши мысли ...

1 Ответ

1 голос
/ 14 июля 2011

Если вы определяете пользовательские подклассы UIView, вы можете использовать для них столько логики, сколько имеет смысл хранить для них локально, предоставлять им протоколы делегатов для передачи чего-либо еще и, пока вы представляете делегат как IBOutlet, вы можете подключить свой контроллер представления в качестве соответствующего делегата непосредственно в Интерфейсном Разработчике или в конструкторе пользовательского интерфейса Xcode 4. Я лично думаю, что это было бы наиболее естественным путем, так как он объединяет любую логику, специфичную для представления, непосредственно в представлении. и позволяет вам выполнить подключение там, где вы обычно делаете подключение.

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

Комментируя предложенные решения напрямую:

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

(2) Я не уверен, что полностью понимаю предложение - для чего определен getViewController и как он знает, как на него реагировать? Если это сами UIViews и контроллер представления должен сначала идентифицировать себя, то я бы предложил просто принять шаблон делегата оптом, а не специализироваться на представлениях и контроллерах представления, например как вы можете захотеть создать составные представления, которые связывают логику из нескольких подпредставлений.

(3) как правило, такие вещи, которые нужно передать init, - это те, которые класс должен знать, чтобы иметь возможность инициализировать; вероятно, было бы лучше использовать обычное свойство для установки контроллера после факта. Или сделайте его IBOutlet и подключите так, чтобы это происходило автоматически через NIB.

...