Как изменить текст UILabel после его программного создания в цикле

Я хотел бы создать 10 кнопок программно. Каждая кнопка имеет подпредставление с двумя метками (одна строка и одно целое число).

После того, как я создал эти 10 кнопок в цикле, я хотел бы получить доступ к обеим меткам. Я попытался NSLog метки кнопки с тегом 0, но это не сработало.

Все это кажется немного неуклюжим, поэтому, пожалуйста, поправьте меня, если я никуда не денусь:

for (int i = 0; i < 9; i++) {

    UIButton* btn = [[[UIButton alloc] initWithFrame:CGRectMake(55, i*(indexHeight+indexSpacing), indexWidth, indexHeight)] autorelease]; 
    btn.tag = i;
    [btn setBackgroundImage:nil forState:UIControlStateNormal];
    [btn    addTarget:self
            action:@selector(buttonTapped:)
  forControlEvents:UIControlEventTouchUpInside];

 // LABELS

    UILabel *btnTitle = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, indexWidth, indexHeight)] autorelease];
     btnTitle.text = @"Empty";

    UILabel *pageTitle = [[[UILabel alloc] initWithFrame:CGRectMake(190, 0, 30, indexHeight)] autorelease];
     pageTitle.text = @"x";

    [indexView addSubview:btn];
    [btn addSubview:btnTitle];
    [btn addSubview:pageTitle];
}

Это то, что я пробовал, и где моя проблема:

NSLog (@"Accessing label 1 in button with tag 0 in indexView: '%@'", [[indexView viewWithTag:0] btnTitle.text]);
NSLog (@"Accessing label 2 in button with tag 0 in indexView: '%@'", [[indexView viewWithTag:0] pageTitle.text]);

"UILabel создан программно - найти его снова?" - это самый близкий вопрос, который я мог find, но на самом деле это не отвечает на вопрос, как получить доступ к меткам в подпредставлении кнопки.


person n.evermind    schedule 24.05.2011    source источник
comment
Не связано с вашим вопросом, но вы пропускаете UIButtons в своем цикле. Вы выделяете UIButton и назначаете его btn, но не отпускаете, пока не переназначите btn var. Вы также пропускаете UILabels для btnTitle и pageTitle по той же причине.   -  person highlycaffeinated    schedule 24.05.2011


Ответы (3)


1

Добавьте этот ivar в свой заголовочный файл:

NSMutableArray *buttonArray;

 

2

Инициализируйте этот массив в файле .m init:

buttonArray = [NSMutableArray array];
[buttonArray retain];

 

3

Измените цикл for следующим образом:

for (int i = 0; i < 9; i++) 
    {
        
        UIButton* btn = [[[UIButton alloc] initWithFrame:CGRectMake(55, i*(indexHeight+indexSpacing), indexWidth, indexHeight)] autorelease]; 
        btn.tag = i;
        [btn setBackgroundImage:nil forState:UIControlStateNormal];
        [btn    addTarget:self
                   action:@selector(buttonTapped:)
         forControlEvents:UIControlEventTouchUpInside];
        
        // LABELS
        
        UILabel *btnTitle = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, indexWidth, indexHeight)] autorelease];
        btnTitle.text = @"Empty";
        
        UILabel *pageTitle = [[[UILabel alloc] initWithFrame:CGRectMake(190, 0, 30, indexHeight)] autorelease];
        pageTitle.text = @"x";
        
        [indexView addSubview:btn];
        [btn addSubview:btnTitle];
        [btnTitle release]; //avoiding leaks
        [btn addSubview:pageTitle];
        [pageTitle release]; //avoiding leaks
        
        
        
        
        
        
        //The changes are here.....
        
        [buttonArray addObject:btn];
        [btn release];
    }

 

4

Чтобы получить доступ к кнопке из вашего массива, выполните (например, кнопка 5):

UIButton *thisButton = (UIButton *)[buttonArray objectAtIndex:5];

 

5

Делай что хочешь с этой кнопкой :)

PS: вы выделяете эти объекты btn внутри цикла for (и похоже, что они не являются иварами). Они потеряют область действия, как только вы выйдете из цикла for, поэтому вы все равно не сможете получить к ним доступ. Вышеупомянутый метод использования NSMutableArray также решает эту проблему, так как теперь вы создали btn и добавили их в массив, который является ivar, поэтому вы не теряете область действия вне цикла for. Кроме того, вам, вероятно, следует создать подкласс UIButton, если вы хотите иметь на нем настраиваемые подвиды.

person Sid    schedule 24.05.2011
comment
Спасибо, это действительно полезно! - person n.evermind; 25.05.2011

Вы также можете попробовать назначить тег для каждой из меток, например, 100 для первой и 101 для второй, тогда ваш код будет выглядеть так для получения меток.

NSLog (@"Accessing label 1 in button with tag 0 in indexView: '%@'", [[indexView viewWithTag:0] viewWithTag:100].text);
NSLog (@"Accessing label 2 in button with tag 0 in indexView: '%@'", [[indexView viewWithTag:0] viewWithTag:101].text);
person arclight    schedule 24.05.2011
comment
Спасибо, но я попробовал NSLog (@"#### Accessing text in a button with tag 0 in indexView: '%@'", [[indexView viewWithTag:0] viewWithTag:10].text); и получил только сообщение об ошибке Запрос члена в чем-то, что не является структурой или объединением? - person n.evermind; 24.05.2011

Следующее наверняка работает, если установлены indexHeight, indexSpacing, indexWidth.

for (int i = 0; i < 9; i++) {

    UIButton* btn = [[[UIButton alloc] initWithFrame:CGRectMake(55, i*(indexHeight+indexSpacing), indexWidth, indexHeight)] autorelease]; 
    btn.tag = i;
    [btn setBackgroundImage:nil forState:UIControlStateNormal];
    [btn    addTarget:self
            action:@selector(buttonTapped:)
  forControlEvents:UIControlEventTouchUpInside];

 // LABELS

    UILabel *btnTitle = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, indexWidth, indexHeight)] autorelease];
     btnTitle.text = @"Empty";

    btnTitle.tag = i+100;
    UILabel *pageTitle = [[[UILabel alloc] initWithFrame:CGRectMake(190, 0, 30, indexHeight)] autorelease];
     pageTitle.text = @"x";
     pageTitle.tag = i+101;

    [indexView addSubview:btn];
    [btn addSubview:btnTitle];
    [btn addSubview:pageTitle];

}

for (int i = 0; i < 9; i++) {
   UILabel *btnTitle = (UILabel *)[[indexView viewWithTag:i] viewWithTag:100+i];
   UILabel *pageTitle = (UILabel *)[[indexView viewWithTag:i] viewWithTag:101+i];
   NSLog (@"btnTitle.text: '%@'", btnTitle.text);
   NSLog (@"pageTitle.text: '%@'", pageTitle.text);

}
person james_womack    schedule 24.05.2011