У вас не должно быть подпредставлений, рассказывающих своему суперпредставлению многое о чем-либо. Вы должны сделать superview делегатом вашего класса представления.
// MainView
MyView *myView = [[MyView alloc] initWithFrame:CGRectMake(...) delegate:self];
Затем сохраните делегат в переменной экземпляра, объявленной id delegate
. Когда вы закончите рисовать:
// MyView
- (void)doDrawing {
drawStuff();
[delegate didFinishDrawingView:(MyView *)self]
}
Теперь вернемся к вашему MainView, реализуйте этот метод
- (void)didFinishDrawingView:(MyView *)aView;
делать то, что вы хотите.
Смысл всего этого в том, что маленьким классам на границе вашего приложения (например, небольшому подпредставлению) не нужно знать, как работают большие классы над ними. Эта настройка позволяет представлению взаимодействовать по цепочке, но с сообщением, которое передает свой собственный статус вместо сообщения, которое инструктирует другой объект делать что-то конкретное. Таким образом, Какао структурирован так, что классы могут быть легко использованы повторно, а их события могут быть перенаправлены так, как вам нужно.
Ваше суперпредставление должно знать, что делать, когда заканчивается его подпредставление. Подвид должен просто дать людям знать, что он закончен.
Объявите переменную экземпляра в заголовке вашего подпредставления следующим образом:
id delegate;
Напишите initiailizer для вашего подпредставления, который выглядит следующим образом:
- (id)initWithFrame:(CGRect)frame delegate:(id)aDelegate {
[super initWithFrame:frame];
delegate = aDelegate;
return self;
}
Теперь у вас есть инициализатор, который примет делегат, сохранит этот делегат и позволит вам затем вызывать методы для него.