Обновление текста в компоненте, нарисованном в drawRect, в подклассе UIView

У меня есть UIView с его подклассом, установленным в построителе интерфейса для созданного мной подкласса UIView. Я хочу обновить метки в классе UIView, в котором они находятся. Кажется, я не могу обновить текст каких-либо ярлыков, нарисованных в drawRect. Какие у меня есть варианты рисования элементов, которые мне нужно изменить в подклассе UIView?

// Using UILabel subclass (FontLabel)

- (void)drawRect:(CGRect)rect {
    scoreLabel = [[FontLabel alloc] initWithFrame:CGRectMake(0,0, 400, 50) fontName:@"Intellect" pointSize:80.0f];
    scoreLabel.textColor = [[UIColor alloc] initWithRed:0.8157 green:0.8000 blue:0.0706 alpha:1.0f];

    [scoreLabel sizeToFit];
    [scoreLabel setText:@"Initial text"];
    [self addSubview:scoreLabel];

    [self setNeedsDisplay]; 
    //Also tried [self setNeedsLayout];
}

- (void)updateScoreLabel:(int)val 
{
    [scoreLabel setText:[NSString stringWithFormat:@"%d", val]];
}   



// Using CATextLayer

- (void)drawRect:(CGRect)rect {
    scoreLabel = [CATextLayer layer];
    [scoreLabel setForegroundColor:[UIColor whiteColor].CGColor];
    [scoreLabel setFrame:CGRectMake(0,0, 200, 20)];
    [scoreLabel setAlignmentMode:kCAAlignmentCenter];
    [[self layer] addSublayer:scoreLabel];
    [scoreLabel setString:@"Initial text"];


    [self setNeedsDisplay]; 
    //Also tried [self setNeedsLayout];
}

- (void)updateScoreLabel:(int)val 
{
    [scoreLabel setString:[NSString stringWithFormat:@"%d", val]];
}   

person Oh Danny Boy    schedule 11.01.2011    source источник
comment
Вы пытаетесь обновить текст программно, или в ИБ?   -  person Kyle Humfeld    schedule 11.01.2011
comment
Программно. Стоит отметить, что я также пробовал это с CATextLayer, и это тоже не сработало.   -  person Oh Danny Boy    schedule 11.01.2011


Ответы (1)


Чтобы программно изменить текст меток, необходимо сделать следующее:

В вашем .h файле:

  • Определите их как UILabels в разделе @interface

  • Добавьте к ним IBOutlets в объявлениях @property

В вашем .m файле:

  • Поместите для них строки @synthesize в свой файл .m.

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

В общем, попытка создать подкласс UIView может быть немного сложной (как вы обнаружите), но, надеюсь, приведенное выше поможет вам хотя бы немного.

person Kyle Humfeld    schedule 11.01.2011
comment
Переменные - это переменные класса. Розетки не стал добавлять, т.к. объекты в ИБ не строятся. - person Oh Danny Boy; 11.01.2011
comment
Я получил доступ к переменным, используя self. и у меня все еще остается текст, который отказывается меняться. - person Oh Danny Boy; 11.01.2011
comment
Ага, значит, вы тоже создаете ярлыки программно. Я не делал этого раньше, поэтому не могу сказать вам наверняка. - person Kyle Humfeld; 12.01.2011
comment
Спасибо, что нашли время ответить. - person Oh Danny Boy; 12.01.2011
comment
@Kyle Humfeld Итак, в конце концов, я выполнил все ваши шаги, я попробовал eithr [imageWithCaptionView.label setText: @testBALBALBAL]; или imageWithCaptionView.label.text = @testBALBALBAL; за которым следует [imageWithCaptionView setNeedsDisplay]; но это не работает. Есть подсказка? Благодарность - person aneuryzm; 09.05.2011