В приложении для фортепиано я назначаю координаты черных клавиш. Вот строка кода, вызывающая ошибку.
'blackKey' и 'whiteKey' являются как customViews
blackKey.center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width);
В приложении для фортепиано я назначаю координаты черных клавиш. Вот строка кода, вызывающая ошибку.
'blackKey' и 'whiteKey' являются как customViews
blackKey.center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width);
Другие ответы не совсем объясняют, что происходит здесь, поэтому это основная проблема:
Когда вы пишете blackKey.center.x
, blackKey.center
и center.x
оба выглядят как доступ к элементам структуры, но на самом деле они совершенно разные вещи. blackKey.center
- это доступ к свойствам, который desugars для чего-то вроде [blackKey center]
, который в свою очередь desugars к чему-то вроде objc_msgSend(blackKey, @selector(center))
. Вы не можете изменить возвращаемое значение функции, например objc_msgSend(blackKey, @selector(center)).x = 2
- это просто не имеет смысла, потому что возвращаемое значение не сохраняется в любом месте значимым.
Итак, если вы хотите изменить структуру, вы должны сохранить возвращаемое значение свойства в переменной, изменить переменную, а затем установить свойство в новое значение.
Вы не можете напрямую изменить значение x
a CGPoint
(или любое значение struct), подобное этому, если оно является свойством объекта. Сделайте что-то вроде следующего.
CGPoint _center = blackKey.center;
_center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width);
blackKey.center = _center;
blackKey.center = CGPointMake ( whiteKey.frame.origin.x + whiteKey.frame.size.width, blackKey.center.y);
Один из способов сделать это.
Один вариант использования макросов:
#define CGPOINT_SETX(point, x_value) { \
CGPoint tempPoint = point; \
tempPoint.x = (x_value); \
point = tempPoint; \
}
#define CGPOINT_SETY(point, y_value) { \
CGPoint tempPoint = point; \
tempPoint.y = (y_value); \
point = tempPoint; \
}
CGPOINT_SETX(blackKey.center, whiteKey.frame.origin.x + whiteKey.frame.size.width);
или немного проще:
CGPOINT_SETX(blackKey.center, CGRectGetMaxX(whiteKey.frame));
Как его значения, вы не можете присвоить значение для выражения. Например, a + b = c это запрещено.