0

В настоящее время все мои кнопки и текстовые поля имеют значения attributedText, определенные как атрибутные строки.Изменение значения текстового значения NSAttributedString для UIControl

Рассмотрите случай с простым UILabel. Всякий раз, когда мне приходится менять текст для этого UILabel (на основе некоторого действия пользователя), я должен переопределить атрибуты на NSAttributedString. Один из способов - просто создать подпрограмму, которая генерирует эти атрибуты всякий раз, когда я их требую, но это связано с тем, что может быть множество разных меток (или атрибутных строк), которые потребуют таких методов удобства.

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

Есть ли простой способ достижения вышеуказанного без переопределения атрибутов?

+1

Что относительно категории? –

+0

Я не уверен, что вы подразумеваете. Что насчет этого? – p0lAris

+0

Каждый раз вам придется переопределять свои атрибуты, нет никакого способа обойти его. Я думаю, что Гарри пытался сказать, что наличие категории в UILabel позволит избежать дублирования кода и позволит вам разоблачить удобные методы для обновления вашего атрибутного текста для всего UILabel через ваш проект. – Champoul

ответ

1

Изучение @ идей Гарри, вот несколько идей:

Категория на NSAttributedString, категория по UILabel или категории на NSDictionary, и, возможно, смесь из них, в соответствии с которым один лучше всего подходит вам и вашему проекту. Использование категории на NSAttributedString в приоритете до UILabel может быть более интересным, если вы хотите использовать пользовательский NSAttributedString для других объектов (например, UITextView).

Хороший старт:

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]; 
} 
+0

Спасибо. Я действительно изучил все эти варианты. Единственная проблема заключается в том, что существуют разные типы меток/текстовых полей; то есть они требуют разных шрифтов и т. д .; Думаю, я мог бы включить это в сеттер и инициализатор. Справедливо! – p0lAris