0

Я использую IB_DESIGNABLE в подклассе UIView, потому что я хочу, чтобы можно было сделать атрибутированную строку программным путем, но она появилась в построителе интерфейса (чтобы сохранить меня от необходимости запуска приложения, чтобы увидеть форматирование)IB_DESIGNABLE с использованием атрибутированных строк

Я сказал, что я могу поместить свой код в

- (void)prepareForInterfaceBuilder; 

И это работает до определенной степени. он появляется в построителе интерфейса. Но когда я иду запускать APP, форматирование теряется. Он по-прежнему отображается в построителе интерфейса, но не в приложении.

Ниже приведены методы, которые я попытался использовать для создания моей атрибутивной строки, но они не отображаются в построителе интерфейса и при запуске приложения.

- (instancetype)initWithFrame:(CGRect)frame; 
- (void)drawRect:(CGRect)frame; 

Однако, с учетом сказанного, я нашел метод, который будет отображаться в APP, но не в построителе интерфейса.

- (instancetype)initWithCoder:(NSCoder *)aDecoder; 

С учетом сказанного, решение было бы просто использовать методы BOTH. Однако мне было интересно, есть ли другой метод, который бы взял лучшее из обоих миров.

Кроме того, я добавлю фрагмент кода, чтобы показать, что я делаю, и предложить некоторое завершение этого запроса.

IB_DESIGNABLE 
@interface FooLabel1 : UILabel 
@property (nonatomic, copy) IBInspectable NSAttributedString *attributedText; 
@end 

@implementation FooLabel1 

- (instancetype)initWithCoder:(NSCoder *)aDecoder { 
    if (self = [super initWithCoder:aDecoder]) { 
     [self localizeattributedString]; 
    } 
    return self; 
} 

- (void)localizeattributedString { 
    NSMutableAttributedString *mat = [[NSMutableAttributedString alloc] initWithString:NSLocalizedString(
      @"Hello" 
      @"Darkness my old friend" 
     , nil) attributes:@{ 
     NSForegroundColorAttributeName : [UIColor orangeColor], 
    }]; 
    [mat appendAttributedString:[[NSAttributedString alloc] initWithString:NSLocalizedString(@"world!", nil) attributes:@{ 
      NSFontAttributeName : [UIFont boldSystemFontOfSize:60], 
      NSForegroundColorAttributeName : [UIColor blueColor] 
    }]]; 
    self.attributedText = [mat autorelease]; 
} 

- (void)prepareForInterfaceBuilder { 
    [self localizeattributedString]; 
} 

@end 

ответ

0

Решение по вашему вопросу работает правильно, но по неправильным причинам. То, что вы хотите сделать, это вызвать ваш метод конфигурации (localizeattributedString) как с initWithCoder:, так и с initWithFrame:, как показано ниже.

prepareForInterfaceBuilder это специальный метод, который только вызывается в контексте рендеринга IB_DESIGNABLE вид. Например, если обычно пользовательское представление получает часть своих данных из веб-службы, то в prepareForInterfaceBuilder вы просто укажете данные примера.