Задача c простым калькулятором вопросы о методе экземпляра addNumber
- (IBAction)addButton; {
for (int i = 0; i<10; i++) {
UIButton *numberButton = [UIButton buttonWithType : UIButtonTypeRoundedRect];
[numberButton addTarget:self action:@selector(numberSelected:) forControlEvents: UIControlEventTouchUpInside];
[numberButton setTitle: [NSString stringWithFormat:@"%d", i] forState: UIControlStateNormal];
if (i<1) {
numberButton.frame = CGRectMake(29, 367.5, 58,50);
}
if (i>=1 && i<4) {
numberButton.frame = CGRectMake((i*.5)*(58/i)+68*(i-1), 332.5, 58,50);
}
if (i>=4 && i<7) {
numberButton.frame = CGRectMake((i*.5)*(58/i)+68*(i-4), 297.5, 58,50);
}
if (i>=7 && i<10) {
numberButton.frame = CGRectMake((i*.5)*(58/i)+68*(i-7), 262.5, 58,50);
}
[self.view addSubview:numberButton];
}
Вот некоторый код из простого калькулятора, это метод экземпляра, где кнопки создаются и располагаются на дисплее. Мои вопросы:
- .frame в заявлении numberButton.frame ... что это делает? зачем это нужно?
- в этом заявлении
[numberButton addTarget:self action:@selector(numberSelected:) forControlEvents: UIControlEventTouchUpInside];
он говорит, что при нажатии кнопки внутри он отправит значение int, инициализированное в цикле for, методу numberSelected, объявленному в заголовочном файле?
Спасибо за ваше время, Майкл.
2 ответа
- От
numberButton.frame
Вы устанавливаете рамку своей кнопки, сообщая своей кнопке, как позиционировать себя на экране.
Например, CGRectMake(29, 367.5, 58,50)
говорит, что на экране начальная позиция вашей кнопки в суперпредставлении равна x = 29 и y = 367,5, а ее размер, в частности, ширина 58, а высота 50.
Необходимо точно указать, так как ваш контроллер не знает, как создать вашу кнопку, имея в виду, какой будет ее размер или начальная позиция. Если вы не укажете это, у вас будет кнопка с 0 высотой и 0 шириной и, вероятно, из (0, 0) позиции.
[numberButton addTarget: собственное действие:@selector(numberSelected:) forControlEvents: UIControlEventTouchUpInside];
Это утверждение говорит, что когда вы нажимаете / нажимаете кнопку, он должен вызывать метод с именем numberSelected, и у этого метода есть параметр, который является экземпляром самой кнопки. Итак, в основном где-то в одном классе контроллера у вас есть метод с сигнатурой
-(void) numberSelected:(UIButton*)sender;
Значение int, которое вы создаете внутри цикла, не имеет ничего общего с этим методом. Вы не передаете это значение типа int, вы передаете саму кнопку в качестве параметра.
Я предлагаю вам прочитать много документации Apple, прежде чем немедленно обратиться за помощью к Stack Overflow. Вы, кажется, смущены вещами, которые очень четко и четко описаны там.
Но, чтобы ответить на ваши вопросы напрямую:
"Рамка" UIView описывает его положение в суперпредставлении, то есть представление, в котором оно содержится. Представления могут содержать другие представления, которые содержат другие представления, вложенные вместе. Подобно изображению в рамке рисунка, у вас есть изображение (ваша кнопка), и вам нужно указать системе, где разместить это изображение на стене (в этом простом случае - окно). https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/WindowsandViews/WindowsandViews.html
Ваш второй метод использует
UIControlEventTouchUpInside
сказать:"Когда пользователь касается этой кнопки и поднимает ее, находясь внутри экранной области кнопки(коснитесь... вверх... внутри)", он должен вызвать метод с именем "numberSelected:". Это отличается от немедленного вызова метода, когда палец пользователя касается экрана. Кроме того, если пользователь касается кнопки, проводит пальцем за пределы изображения кнопки, а затем поднимает, метод вызываться не будет.
":" Означает, что вы собираетесь передать значение этому методу, и система фактически сделает это за вас. Будет отправлено нажатие кнопки в качестве параметра, переданного параметру "numberSelected:"
UIButton является подклассом UIControl, аaddTarget:action:forControlEvents
метод подробно описан в этой части документации.