Как изменить текст UILabel после его программного создания в цикле - PullRequest
1 голос
/ 24 мая 2011

Я хотел бы создать 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 создан программно - найти его снова? " - самый близкий вопрос, который я мог найти, но он не дает ответа на вопрос о том, как получить доступ к меткам в подпредставлении btn.

Ответы [ 3 ]

2 голосов
/ 24 мая 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);
1 голос
/ 25 мая 2011

1

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

NSMutableArray *buttonArray;

2

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

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 (и кажется, что они не ivars). Когда вы выйдете за цикл for, они потеряют область видимости, поэтому вы все равно не сможете получить к ним доступ. Вышеупомянутый метод использования NSMutableArray решает эту проблему также, как теперь вы создали btn и добавили их в массив, который является ivar, так что вы не потеряете область действия вне цикла for. Кроме того, вам, вероятно, следует создать подкласс UIButton, если вы хотите иметь собственные подпредставления на нем.

1 голос
/ 25 мая 2011

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

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