Задача C: Ошибка при создании uibuttons из массива? - PullRequest
0 голосов
/ 25 октября 2011

Я застрял в следующих кодах:

btn1 = [UIButton alloc];
btn2 = [UIButton alloc];
btn3 = [UIButton alloc];
btn4 = [UIButton alloc];
btn5 = [UIButton alloc];
btn6 = [UIButton alloc];
NSArray *myarray = [NSArray arrayWithObjects:btn1, btn2, btn3, btn4, btn5, btn6,nil];

for (int i =0; i < [myarray count]; i++)
{
    NSLog(@"What: %@", [myarray objectAtIndex:i]); // Result UIButton
    [myarray objectAtIndex:i].frame = CGRectMake(i* 110+25, 60, 100, 100);// error, cant build
    UIButton *b = (UIButton *)[myarray objectAtIndex:i];
    b.frame = CGRectMake(i* 110+25, 60, 100, 100);
    [b setTitle:@"my button" forState:UIControlStateNormal];
    b.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
    b.titleLabel.textAlignment = UITextAlignmentCenter;
    b.titleLabel.textColor = [UIColor colorWithRed:0x93/255.0 green:0x73/255.0 blue:0x47/255.0 alpha:1.0];
    b.tag = i+1;
    [b addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchDown];
    [self addSubview: b];
    [b release];
}

Первоначально я использую регистр переключателя, например:

switch (i)
    case 0: {
        /*
        ..... 
        repeat this code
        .....
    }

Таким образом, если используется регистр переключателя, коды очень длинные.Причина, по которой я это повторяю:

  • Позиция
  • Старайтесь не повторять код, например, установите заголовок, фон, добавьте цель и т. Д.

Или у вас есть более простой / короткий код?

Ответы [ 5 ]

3 голосов
/ 25 октября 2011

Вы разрешили UIB-кнопки, но не инициализировали их.

UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, 10, 10)];

Вам также необходимо кэшировать указатель UIButton в цикле

UIButton *currentButton = [myarray objectAtIndex:i];

, а затем заменить все экземпляры '[myarray objectAtIndex: i] 'с' currentButton '

0 голосов
/ 25 октября 2011
UIButton *btn1 = [[UIButton alloc] init];
    UIButton *btn2 = [[UIButton alloc] init];
    UIButton *btn3 = [[UIButton alloc] init];
    UIButton *btn4 = [[UIButton alloc] init];
    UIButton *btn5 = [[UIButton alloc] init];
    UIButton *btn6 = [[UIButton alloc] init];
    NSArray *myarray = [NSArray arrayWithObjects:btn1, btn2, btn3, btn4, btn5, btn6,nil];

    for (int i =0; i < [myarray count]; i++)
    {
        NSLog(@"What: %@", [myarray objectAtIndex:i]);        
        UIButton *b = (UIButton *)[myarray objectAtIndex:i];
        b.frame = CGRectMake(i* 110+25, 60, 100, 100);
        [b setTitle:@"my button" forState:UIControlStateNormal];
        b.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
        b.titleLabel.textAlignment = UITextAlignmentCenter;
        float red = 0.33;
        float green = 0.82;
        float blue = 0.48;

        //Color values are float values between 0 and 1;

        b.titleLabel.textColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
        b.tag = i+1;
        [b addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchDown];
        [self.view addSubview: b];
        [b release];
    }
0 голосов
/ 25 октября 2011
[myarray objectAtIndex:i].frame = CGRectMake(i* 110+25, 60, 100, 100);// error, cant build 

Выдает ошибку, потому что вы не можете использовать точечный синтаксис для доступа к объектам приведения (или в данном случае id). Если вы удалите эту строку и поставите следующее после установки b:

b.frame = CGRectMake(i* 110+25, 60, 100, 100);

Вы больше не получите ошибку.

Вы также можете оптимизировать цикл, используя быстрое перечисление:

for (UIButton *b in myArray)

Другие ответчики правы, указав, что вы в первую очередь не создаете кнопки должным образом - используйте buttonWithType или alloc и initWithFrame.

0 голосов
/ 25 октября 2011

Вы можете попробовать это?

for (int i =0; i < [myarray count]; i++)
{
    UIButton *b = [[UIButton alloc] initWithFrame:CGRectMake(i* 110+25, 60, 100, 100)];
    [b setTitle:@"my button" forState:UIControlStateNormal];
    b.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
    b.titleLabel.textAlignment = UITextAlignmentCenter;
    b.titleLabel.textColor = [UIColor colorWithRed:0x93/255.0 green:0x73/255.0 blue:0x47/255.0 alpha:1.0];
    b.tag = i+1;
    [b addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchDown];
    [self addSubview: b];
    [b release];
}

Я думаю, вы забыли инициализировать свои кнопки.Есть разные способы их инициализации.init, initWithFrame и initWithCoder

0 голосов
/ 25 октября 2011
btn1 = [UIButton alloc];

Вам нужно инициализировать после alloc, иначе вы только что выделили мусорную память

btn1 = [[UIButton alloc] init];

Также

[myarray objectAtIndex:i].frame = CGRectMake(i* 110+25, 60, 100, 100);// error, cant build

терпит неудачу, потому что не знает, к какому классу относится объект, и, следовательно, может ли он вызывать setFrame: для него, поэтому вам нужно привести его как кнопку (которая является подклассом UIView)

UIButton *b = (UIButton *)[myarray objectAtIndex:i];
b.frame = CGRectMake(i* 110+25, 60, 100, 100);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...