0

属性付きの文字列をプログラムで作成できるようにしたいので、UIView サブクラスで IB_DESIGNABLE を使用していますが、それを Interface builder に表示します (フォーマットを確認するためにアプリを実行する必要がなくなります)。

コードを入れることができると言われました

- (void)prepareForInterfaceBuilder;

そして、それはある程度機能します。インターフェイスビルダーに表示されます。しかし、APP を実行すると、フォーマットが失われます。インターフェイスビルダーには引き続き表示されますが、アプリには表示されません。

以下は、属性付き文字列を作成するために使用しようとしたメソッドですが、インターフェイス ビルダーにもアプリの実行時にも表示されません。

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

ただし、そうは言っても、アプリではレンダリングされますが、インターフェイスビルダーではレンダリングされないメソッドが見つかりました。

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

そうは言っても、解決策は両方の方法を使用することです。しかし、両方の長所を活かす別の方法があるのではないかと考えていました。

また、コード スニペットを追加して、実行していることを示し、このクエリを補完します。

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
4

1 に答える 1

0

あなたの質問の解決策は適切に機能しますが、間違った理由があります。以下のように、とのlocalizeattributedString両方から構成メソッド ( ) を呼び出します。initWithCoder:initWithFrame:

prepareForInterfaceBuilderビューをレンダリングするコンテキストでのみ呼び出される特別なメソッドですIB_DESIGNABLE。たとえば、通常、カスタム ビューが Web サービスからデータの一部を取得する場合、prepareForInterfaceBuilder代わりにサンプル データを提供するだけです。

@implementation FooLabel1

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

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self localizeattributedString];
    }
    return self;
}

- (void)localizeattributedString {
    ...
}

@end
于 2015-02-06T20:23:24.517 に答える