Создание классов C4
Я пытаюсь написать новый класс внутри проекта C4-Libpd. Все, что я хочу сделать, - так это то, что я хочу узнать, как управлять классами в Objective-C, получая функциональность из "последовательного" кода, который я написал, в более объектно-ориентированном виде. Одна из проблем, с которыми я сталкиваюсь, заключается в том, как добавить addShape на холст как метод нового класса:
- (void) displayCrosshair{
[self.canvas addShape:xLine];
[self.canvas addShape:yLine];
[self.canvas addShape:s];
}
дает мне ошибку:
Свойство canvas не найдено на объекте типа...
Я это понимаю self.canvas
изнутри класса это не правильно, если я не создал еще один холст внутри класса, если я хочу добавить Shape на основной холст и просто использовать метод для работы с объектами. Итак, какой правильный способ сделать это?
1 ответ
Один из самых простых способов заставить вещи происходить на холсте, когда метод или действие происходит в отдельном объекте, - это использовать уведомления. Использование уведомлений делает 2 вещи, это позволяет другим объектам реагировать на события по-своему, и это позволяет разъединять (то есть не жестко кодировать) ссылки на объекты.
Вы можете публиковать уведомления, как это:
@interface MyClass : C4Shape
-(void)displayCrosshair;
@end
@implementation MyClass
-(void)displayCrosshair {
[self postNotification:@"displayCrosshairNotification"];
}
@end
Затем, чтобы заставить холст прослушивать уведомление, вы можете сделать это:
-(void)setup {
C4Shape *crossHair = ...;
crossHair.hidden = YES;
[self.canvas addShape:crossHair];
[self listenFor:@"displayCrosshairNotification" fromObject:obj andRunMethod:@"displayCrosshair"];
}
-(void)displayCrosshair {
crossHair.hidden = NO;
}
Кроме того, вы можете установить свойство в своем подклассе для холста:
@interface MyClass : C4Shape
@property (readwrite, nonatomic) C4View *canvas;
@end
... а затем сделать жесткую ссылку на ваш холст, когда вы создаете свой подкласс в C4WorkSpace.m
вот так:
@implementation C4WorkSpace {
MyClass *obj;
}
-(void)setup {
obj = [[MyClass alloc] init];
obj.canvas = self.canvas;
[self.canvas addSubview:obj];
}
Этот трюк должен работать, но я предпочитаю метод уведомления.
Заключительная мысль... Если подклассный объект, о котором вы говорите, на самом деле является перекрестием, то я бы даже не стал беспокоиться об уведомлении на холсте.
Вместо этого я бы создал перекрестие в качестве подкласса C4Shape, чтобы оно управляло собственной видимостью:
На холсте:
-(void)setup {
MyShape *crossHair = [[MyShape alloc] initWithFrame:...];
[self.canvas addShape:crosshair];
}
В вашей форме подкласс:
@interface MyShape : C4Shape
-(void)displayCrosshair;
-(void)hideCrosshair;
@end
@implementation MyShape
-(void)setup {
[self addShape:xLine];
[self addShape:yLine];
[self hideCrosshair];
}
-(void)displayCrosshair {
self.hidden = NO;
}
-(void)hideCrosshair {
self.hidden = YES;
}
@end
Что, вероятно, лучший подход.