Создайте цикл for для добавления 39 кнопок в массив - PullRequest
8 голосов
/ 14 апреля 2011

У меня есть 39 различных переменных UIButton в моем .h файле, но я хотел бы добавить каждую из них в массив без необходимости набирать одно и то же 39 раз.

Есть ли способ сделать это в цикле for?

Кнопки имеют соответствующие названия: btn1, btn2, btn3 и т. Д.

Ответы [ 5 ]

23 голосов
/ 14 апреля 2011

Вы можете отказаться от 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 счастлив!

9 голосов
/ 14 апреля 2011

Вроде так:

NSMutableArray *arr = [NSMutableArray array];
for(int i = 1; i <= 39; ++i) {
  [arr addObject:[self valueForKey:[NSString stringWithFormat:@"btn%d", i]]];
}
4 голосов
/ 14 апреля 2011
for(int i=1; i<totalButtonCount; i++) {
   NSString *buttonClassName = [NSString stringWithFormat:@"btn%d", i];
   [[NSClassFromString(buttonClassName) alloc] init];
   //add to array
}

Изменить: после перечитывания вашего вопроса, это может быть не то, что вы спрашиваете. Я думал, что вы хотите создать кучу экземпляров похожих классов.

3 голосов
/ 14 апреля 2011

Вы можете создать метод получения, названный в честь каждой кнопки и затем вызвать [self valueForKey:];для каждого, но что-то здесь просто кричит "ужасный дизайн":)

2 голосов
/ 14 апреля 2011

Программирование значения ключа - ваш друг

По сути, вы можете делать циклы и создавать свои кнопки, и если у вас есть свойства, определенные для ваших кнопок, вы можете.

[self setObject:newButton forKey@"button1"];

где button1 - это та же строка, что и имя вашей переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...