Я хочу, чтобы определить класс перемещаемых изображений подклассов 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?
Спасибо. Делегаты теперь для меня. Я предполагаю, что позволяет использовать более одного типа сообщения в протоколе .. для того, что я исследовал @protocol MyType1ImageControllerDelegate - (void) MyType1ImageViewControllerMoved: (MyType1ImageViewController *) myType1ImageViewController; - (void) MyType1ImageViewControllerEnded: (MyType1ImageViewController *) myType1ImageViewController; @end –
Несомненно, протокол может содержать столько методов, сколько вы хотите. Просто запомните соглашения об именах: имена классов и протоколов начинаются с заглавной буквы, имена методов начинаются с строчной буквы. –