Вы не можете инициализировать переменную экземпляра в своем объявлении. Это как раз Objective-C. В этом отношении он отличается от Java или C# (или C++ 11). Все переменные экземпляра инициализируются до нуля.
Вы не сказали, какой класс содержит эту переменную экземпляра.
Если вы загружаете объект из XIB или раскадровки, не имеет значения, какой класс он есть; он будет инициализирован, получив сообщение initWithCoder:
. Итак, инициализируйте backButtonRect
в initWithCoder:
. Пример:
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
if ((self = [super initWithCoder:aDecoder])) {
CGFloat w = 100, h = 64;
backButtonRect = CGRectMake(2 * w/25, 18 * h/25, 6 * w/25, 2 * h/25);
}
return self;
}
В качестве альтернативы, если вы не будете знать w
и h
, пока все ваши выходы подключены, инициализировать backButtonRect
в awakeFromNib
:
- (void)awakeFromNib {
[super awakeFromNib];
backButtonRect = CGRectMake(2 * w/25, 18 * h/25, 6 * w/25, 2 * h/25);
}
Если вы создаете объект в коде , то имеет значение, какой класс он есть. Если это UIView
подкласс, назначенный инициализатор initWithFrame:
, так что это хороший способ, чтобы переопределить для инициализации:
- (instancetype)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
CGFloat w = 100, h = 64;
backButtonRect = CGRectMake(2 * w/25, 18 * h/25, 6 * w/25, 2 * h/25);
}
return self;
}
Если это UIViewController
подкласс, то назначенный инициализатор initWithNibName:bundle:
.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
CGFloat w = 100, h = 64;
backButtonRect = CGRectMake(2 * w/25, 18 * h/25, 6 * w/25, 2 * h/25);
}
return self;
}
Это не позволит вам сделать это, потому что вы не можете определить переменную экземпляра при ее объявлении. – Abizern
Какой странный язык. – Jessica
@eeeeeeeeee Нет, это не странно, вы просто понимаете его дизайн. Вы можете переместить их в метод initWithXXX: 'или' #define BACK_BUTTON_RECT ((CGRect) {x, y, w, h}) '. –