iphone: помечает значения над записью. - PullRequest
0 голосов
/ 01 августа 2011

Я вставляю метку в UIButton, используя addSubView

Здесь значение метки будет меняться каждый раз.

    UILabel *backTopLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 30, 448, 66)];
    backTopLabel.backgroundColor = [UIColor clearColor];
    backTopLabel.textColor = [UIColor whiteColor];
    backTopLabel.font = [UIFont fontWithName:@"Georgia" size:56];
    backTopLabel.textAlignment = UITextAlignmentCenter;

    backTopLabel.text = [[selectedUsers objectAtIndex:userIndex] valueForKey:@"FirstName"];   // UserIndex will be change and new data will be load in the label


    [btnBackLeftCard addSubview:backTopLabel];   // btnBackLeftCard is the UIButton
    [backTopLabel release];

Проблема в том, что она успешно меняет значение метки, нозакончилась запись.

Я получаю новое значение метки поверх старого значения метки.

Как я могу решить эту проблему?

Ответы [ 5 ]

4 голосов
/ 01 августа 2011

Каждый раз, когда вы звоните [[UILabel alloc] initWithFrame:CGRectMake(0, 30, 448, 66)], вы создаете новую память, не обращаясь к существующей памяти.

Итак, вам нужно что-то вроде

if(!backTopLabel)
    backTopLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 30, 448, 66)];

так что вы создаете память, только если она не существует.

Однако, так как ваш ярлык не является собственностью, вы в любом случае теряете к нему доступ. Поэтому вам нужно либо добавить метку как свойство класса, в котором вы находитесь, ИЛИ пометить представление, чтобы вы могли найти его снова и удалить.

Пометьте это и найдите снова так:

for(UIView* labelView in btnBackLeftCard.subviews)
{
   if(labelView.tag = 100)
      [labelView removeFromSuperView];
}

UILabel *backTopLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 30, 448, 66)];
backTopLabel.backgroundColor = [UIColor clearColor];
backTopLabel.textColor = [UIColor whiteColor];
backTopLabel.font = [UIFont fontWithName:@"Georgia" size:56];
backTopLabel.textAlignment = UITextAlignmentCenter;

//here is where you tag the view, so you can find it again
backTopLabel.view.tag = 100;

backTopLabel.text = [[selectedUsers objectAtIndex:userIndex] valueForKey:@"FirstName"];   

[btnBackLeftCard addSubview:backTopLabel];   // btnBackLeftCard is the UIButton
[backTopLabel release];
1 голос
/ 01 августа 2011

Если у вас есть только одно подпредставление для вставки в UIButton, вы можете использовать

for(UILabel *lblViews in [btn subviews]) //Remove all subviews which are labels under button first if any
 {
      if(lblViews.tag == sometagno) //Compare tag number and remove only if that label found.
              [lblViews removeFromSuperview];
 }

backTopLabel.tag = sometagno; //Assign some tag number while adding.
[btnBackLeftCard addSubview:backTopLabel]; //Than Add your subview
0 голосов
/ 22 июня 2012

Я работаю в COCOS2D.Если вы объявили ярлык глобально, используйте

[labelName removeFromParentAndCleanup:YES]

0 голосов
/ 01 августа 2011

Я думаю, что вы снова добавляете подпредставление (UILabel). Вы должны только изменить текст UILabel

0 голосов
/ 01 августа 2011

Это в основном происходит, когда представление добавляется как подпредставление в другое представление. В вашем случае оно добавляется несколько раз.

Создайте одну UILabel, а затем просто измените ее текстовое свойство.

В вашем случае вы создаете его несколько раз и добавляете поверх предыдущего.

Или, если вы не можете повторно использовать ранее созданный, попробуйте удалить его из суперпредставления, а затем добавить последний ..

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