Уведомление ViewController из пользовательского подкласса UIImageView - PullRequest
1 голос
/ 03 февраля 2011

Я хочу определить класс перетаскиваемых изображений, подклассифицируя 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 для touchesEnded (например). Я сделал это, написав весь код на viewcontroller, но я хочу сделать это, используя подклассы, чтобы я мог отделить обработку событий и визуализацию изображений от реальной функциональности моего интерфейса. Поэтому, если у меня 15 перетаскиваемых изображений, мне не нужно угадывать, какое изображение соприкасается, и решать, какие визуальные эффекты применять.

Возможно ли это? Errooneus aproach?

1 Ответ

0 голосов
/ 03 февраля 2011

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

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

Вашему MyType1Image также требуется свойство id <MyType1ImageDelegate> delegate.

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

...