2011-02-03 3 views
1

Я хочу, чтобы определить класс перемещаемых изображений подклассов UIImageView, разделяющие, как они выглядят (на подклассе) и то, что пользовательский интерфейс реагирует туда, где они двигаются (на ViewController)Уведомление ViewController из пользовательского UIImageView подкласса

myType1Image .h

@interface myType1Image : UIImageView { } 

myType1Image.m

... 
- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
// Retrieve the initial touch point 
} 
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { 
// Move relative to the original touch point with some special effect 
} 
- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event { 
// Notify the ViewController ... here is my problem...how? 
// would call GotIt on viewController for example 
} 
... 

реализация ViewController

.... 
    myType1Image *img = [[myType1Image alloc] initWithImage:[UIImage imageNamed:@"iOSDevTips.png"]]; 
    img.center = CGPointMake(110, 75); 
    img.userInteractionEnabled = YES; 
    [subview addSubview:img]; 
... 

- (void) gotIt:(id) (myType1Image *)sender{ 
    if (CGRectContainsPoint(myimage.frame, [sender.center])){ 
     NSLog(@"Got IT!!!"); 
    } 
} 

.... 

Я не могу понять, как ViewController может быть уведомлен из класса myType1Image, для touchsEnded (например). Я сделал это, написав весь код на viewcontroller, но я хочу сделать это с помощью подклассов, чтобы я мог отделить обработку событий и визуализацию изображений от реальной функциональности моего интерфейса. Так что, если у меня есть 15 перетаскиваемых изображений, я не должен угадывать, какое изображение касается, и решает, какие визуальные эффекты применять.

Возможно ли это? Является ошибочным aproach?

ответ

0

Во-первых, имена классов должны начинаться с заглавной буквы (MyType1Image).

Создать протокол MyType1ImageDelegate, в котором вы объявляете методы делегата, которые вид изображения отправляет его делегату (контроллеру вида). Первый аргумент этих методов должен всегда иметь тип MyType1Image * (чтобы сообщить делегату, с какого объекта приходит сообщение).

Вашему MyType1Image также нужен объект id <MyType1ImageDelegate> delegate.

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

+0

Спасибо. Делегаты теперь для меня. Я предполагаю, что позволяет использовать более одного типа сообщения в протоколе .. для того, что я исследовал @protocol MyType1ImageControllerDelegate - (void) MyType1ImageViewControllerMoved: (MyType1ImageViewController *) myType1ImageViewController; - (void) MyType1ImageViewControllerEnded: (MyType1ImageViewController *) myType1ImageViewController; @end –

+0

Несомненно, протокол может содержать столько методов, сколько вы хотите. Просто запомните соглашения об именах: имена классов и протоколов начинаются с заглавной буквы, имена методов начинаются с строчной буквы. –

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