Проблемы инициализации C4Shape Custom Subclass?
Я задал еще один вопрос относительно этого проекта, и Трэвис был очень полезным. Предыдущий вопрос
Принимая во внимание этот совет, я пытаюсь создать подкласс для класса C4Shape, я добавил 2 свойства (оба с плавающей запятой) к классу для значений положения X и Y. Причина, по которой я не просто вызываю свойство.center в C4Shape, заключается в том, что для добавления их на холст я предпочитаю использовать верхний левый угол вместо центра.
Я пытаюсь написать собственный метод Init для этого нового класса, однако получаю ошибку.
Вот пользовательский код инициализации, с которым я работаю:
customShape.m
- (id)initWithColor:(UIColor *)fillColor atX:(float)_xValue atY:(float)_yValue
{
CGRect frame = CGRectMake(_xValue, _yValue, 100, 100);
self = [customShape rect:frame];
self.lineWidth = 0.0f;
self.fillColor = fillColor;
self.xValue = _xValue;
self.yValue = _yValue;
return self;
}
C4WorkSpace.m
-(void)setup {
customShape *testShape = [[customShape alloc]initWithColor:[UIColor greenColor] atX:50.0f atY:50.0f];
[self.canvas addShape:testShape];
}
Я подозреваю, что виновник self = [customShape rect:frame];
Это предупреждение, которое я вижу: "Несовместимый тип указателя, присваиваемый" customeShape *_strong "из" C4Shape * ""
Фактическая ошибка, возникающая при попытке запустить это: "Завершение приложения из-за необработанного исключения" NSInvalidArgumentException ", причина:" -[C4Shape setXValue:]: нераспознанный селектор, отправленный экземпляру 0x9812580 ""
Как и прежде, я делаю кнопки, которые могут содержать значение цвета, и когда вы нажимаете эту кнопку, она отправляет пакет UDP с этими кнопками fillColor, а также IPad IPads.
1 ответ
Вы довольно близки к реализации вашего метода init. Я бы перестроил это следующим образом:
- (id)initWithColor:(UIColor *)aColor origin:(CGPoint)aPoint {
self = [super init];
if(self != nil) {
CGRect frame = CGRectMake(0,0, 100, 100);
[self rect:frame];
self.lineWidth = 0.0f;
self.fillColor = aColor;
self.origin = aPoint;
}
return self;
}
Несколько вещей, чтобы отметить:
- При создании подклассов всегда хорошо вызывать метод init суперкласса объекта
- Это хорошая практика, чтобы обернуть
init
вашего подкласса вif
оператор, проверяющий, правильно ли возвращен init суперкласса. - Создайте рамку для вашего нового объекта и вызовите
rect:
наself
непосредственно. - Есть
origin
указывать на каждый видимый объект C4, поэтому вместо использованияx
а такжеy
значения непосредственно, вы можете установить источник с помощьюCGPoint
(origin
это верхний левый угол).
Затем вам нужно добавить этот метод в ваш .h
файл:
@interface MyShape : C4Shape
-(id)initWithColor:(UIColor *)aColor origin:(CGPoint)aPoint;
@end
Наконец, вы можете создать свою форму в вашем C4WorkSpace
как это:
MyShape *m = [[MyShape alloc] initWithColor:[UIColor darkGrayColor]
origin:CGPointMake(100, 100)];
И, если вы добавите строку к методу, который вы нажали, вы можете проверить точку начала кнопки:
-(void)heardTap:(NSNotification *)aNotification {
MyShape *notificationShape = (MyShape *)[aNotification object];
C4Log(@"%4.2f,%4.2f",notificationShape.center.x,notificationShape.center.y);
C4Log(@"%4.2f,%4.2f",notificationShape.origin.x,notificationShape.origin.y);
C4Log(@"%@",notificationShape.strokeColor);
}
Пока вы можете работать с x
а также y
значения как свойства, я рекомендую работать с CGPoint
структур. Это почти то же самое, за исключением того, что вы переходите от C4 к Objective-C, вы заметите, что CGPoint
и другие CG
Геометрические структуры используются повсеместно.