Вы можете отказаться от 39 кнопок в вашем заголовочном файле и вместо этого иметь один массив.Я подозреваю, что вы хотите использовать ручные ссылки, чтобы вы могли использовать Interface Builder для управления событиями и макетом.Я предлагаю сделать что-то немного другое.
Создайте одно свойство - NSMutableArray
.Затем, когда представление загружается, создайте кнопки на лету.
Чтобы получить доступ к кнопке, используйте что-то вроде [self.arrayOfButtons objectAtIndex:38];
.(В случае 39 кнопок, которые возвращали бы последнюю кнопку.); `
Чтобы создать кнопку, вы используете следующее:
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
Обратите внимание, что вы передаете в кадреinit
метода вашей кнопки.Рамка вашей кнопки будет начинаться в верхнем левом углу ее контейнера, и ваша кнопка будет иметь площадь 100 пикселей.Кадр является экземпляром CGRect
.(Вы создаете CGRect
, вызывая функцию CGRectMake(x,y,width,height)
.
Чтобы создать 39 кнопок, вам может потребоваться выполнить цикл следующим образом, учитывая массив для хранения кнопок myButtons
и предопределенный numberOfButtons
и размерные переменные:
for(int i=0;i<numberOfButtons;i++){
//Create the button
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(x,y,width, height)];
//Store the button in our array
[self.myArray addObject:button];
//Release the button (our array retains it for us)
[button release];
}
Конечно, вам нужно установить уникальные значения для x
, y
, width
и height
для каждой кнопки, или они все будут перекрываться.Вы создали свои кнопки, вы можете с ними что-то делать, например, устанавливать метки или показывать их на экране. Чтобы показать их на экране, вы можете сделать что-то вроде этого:
for(UIButton *button in self.myButtons){
//add the button to the view
[self.view addSubview:button];
}
Конечно, просто добавивКнопки на экране бесполезны. Вы должны быть в состоянии заставить их что-то делать. Чтобы добавить действие к кнопке, вы можете использовать:
[button addTarget:self action:@selector(someMethod:) forControlEvents:UIControlEventTouchDown];
Первая часть, addTarget:self
, говорит, что этоконтроллер представления обрабатывает событие, которое вы собираетесь попросить его обработать. action:@selector(someMethod:)
сообщает классу, какой метод выполнять при возникновении события. Затем forControlEvents:UIControlEventTouchDown
говорит, что указанный класс должен выполнять указанный метод, когда кнопкапостучал.
So, в заголовке:
#import <UIKit/UIKit.h>
@interface MyClass :UIViewController{
NSMutableArray *myButtons;
}
@property (nonatomic, retain) NSMutableArray *myButtons;
//Use UIButton as the sender type if you want
- (void)someMethod:(id)sender;
// ... Other code can go here of course
@end
И в вашей реализации вы можете использовать это:
#import MyClass.h
@implementation MyClass
- (id)init{
self = [super init];
if(self){
NSMutableArray *temp = [[NSMutableArray alloc] init];
self.myButtons = temp;
[temp release];
}
return self;
}
- (void)viewDidLoad{
//
// Create the buttons
//
for(int i=0;i<numberOfButtons;i++){
//Create the button
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(x,y,width, height)];
//You may want to set button titles here
//or perform other customizations
//Store the button in our array
[self.myArray addObject:button];
//Release the button (our array retains it for us)
[button release];
}
//
// Show the buttons onscreen
//
for(UIButton *button in self.myButtons){
//add the button to the view
[self.view addSubview:button];
//add the action
[button addTarget:self action:@selector(someMethod:) forControlEvents:UIControlEventTouchDown];
}
}
- (void)someMethod:(id)sender{
//Do something when the button was pressed;
}
- (void)dealloc{
[self.myButtons release];
[super dealloc];
}
@end
Теперь вы можете перейти к кнопкерай, не взяв Interface Builder в самолете.Go UIButton счастлив!