0

目前我所有的按钮和文本字段都有attributedText定义为属性字符串的值。

考虑一个简单的情况UILabel。每当我必须为此更改文本UILabel(基于某些用户操作)时,我必须重新定义NSAttributedString. 一种方法是简单地创建一个子例程,在我需要它们时生成这些属性,但这是一个问题,因为可能有许多不同的标签(或属性字符串)需要这些便利方法。

另一个可能是简单地更改text字段并让观察者添加这些属性,但这是相同数量的工作,现在可能更复杂。

有没有一种简单的方法可以在不重新定义属性的情况下实现上述目标?

4

1 回答 1

1

探索@Harry 的想法,这里有一些想法:

Category on NSAttributedString、 category onUILabel或 category on NSDictionary,也可能是它们的混合,根据哪个最适合您和您的项目。如果您想将自定义用于其他类型的对象(例如 a ) ,则NSAttributedString在优先级上使用类别可能会更有趣。UILabelNSAttributedStringUITextView

一个好的开始:

typedef enum : NSUInteger {
    AttributeStyle1,
    AttributeStyle2,
} AttributeStyles;

一个可能的类别方法NSDictionary

-(NSDictionary *)attributesForStyle:(AttributeStyles)style
{
    NSDictionary *attributes;
    switch(style)
    {
        case AttributeStyle1:
            attributes = @{}//Set it
            break;
        case AttributeStyle2:
            attributes = @{}//Set it
            break;
        default:
            attributes = @{}//Set it
            break;
    }
    return attributes;
}

可能的类别UILabel

-(void)setString:(NSString *)string withAttributes:(NSDictionary *)attributes
{
    [self setAttributedText:[[NSAttributedString alloc] initWithString:string attributes:attributes];
}

可能的类别NSAttributedString

-(NSAttributedString  *)initWithString:(NSString *)string withStyle:(AttributedStyles)style
{
    //Here, a mix is possible using the first method, or doing here the switch case
    //Ex:  return [[NSAttributedString alloc] initWithString:string attributes:[NSDictionary attributesForStyle:style];
    //And to use like this: [yourLabel setAttributedText:[[NSAttributedString alloc] initWithString:string withStyle:AttributeStyle1];
}
于 2015-01-12T18:48:30.790 回答