Обработка строк в Objective-C с помощью NSAttributedString - PullRequest
1 голос
/ 22 декабря 2008

У меня есть NSAttributedString s и целое число i, и я хотел бы функцию, которая принимает s и i и возвращает новую NSAttributedString с (stringified) i, добавленным к s.

Похоже, что какая-то комбинация -stringWithFormat:, -initWithString: и -insertAttributedString: могла бы сделать это, но у меня возникли проблемы с соединением без большой свертки и временных переменных.

В целом, указатели на руководства по осмыслению NSAttributedString и NSMutableAttributedString были бы замечательными.

Ответы [ 4 ]

9 голосов
/ 22 декабря 2008

Мне кажется, я нашел другой способ:

// convert it to a mutable string
NSMutableAttributedString *newString;
newString = [[NSMutableAttributedString alloc] initWithAttributedString:old];

// create string containing the number
NSString *numberString = [NSString stringWithFormat:@"%i", i];

// append the number to the new string
[newString replaceCharactersInRange:NSMakeRange([newString length] - 1, 0) 
                         withString:numberString];

Я думаю, что это работает, потому что Документация Apple говорит:

- (void) replaceCharactersInRange: (NSRange) aRange withString: (NSString *) aString

Новые персонажи наследуют атрибуты первого заменили персонаж из диапазона Где длина aRange равна 0, новый символы наследуют атрибуты символ предшествующий aRange, если он имеет любой, в противном случае характер следующий aRange.

4 голосов
/ 22 декабря 2008

Указатели здесь: Руководство по программированию атрибутных строк

Краткий ответ - использовать NSMutableAttributedString - поскольку он наследуется от NSAttributedString, его можно использовать везде, где вы используете (неизменяемый) NSAttributedString.

Вновь созданный NSMAS может отбирать содержимое и атрибуты NSAS с помощью метода setAttributedString:. Затем вы можете свободно заменитьCharactersInRange: или deleteCharactersInRange: или вставитьAttributedString: atIndex: в свое удовольствие.

3 голосов
/ 22 декабря 2008

Вот одна строчка для этого, благодаря дружелюбным людям на IRC-канале разработчиков adium. Требуется NSAttributedString s и целое число i.

return [[[NSMutableAttributedString alloc] 
         initWithString:[NSString stringWithFormat:@"%i %@", i, [s string]]]
        autorelease];
0 голосов
/ 26 августа 2016

Если у вас есть несколько приписанных строк, которые вы хотите поместить в другую приписанную строку, вы можете использовать эту категорию, которую я написал:

Однако вам придется передать NULL в качестве последнего аргумента функции, в противном случае произойдет сбой из-за ограничений va_list при определении размера.

[attributeString stringWithFormat: attrFormat, attrArg1, attrArg2, NULL];

@implementation NSAttributedString(stringWithFormat)

+(NSAttributedString*)stringWithFormat:(NSAttributedString*)format, ...{
    va_list args;
    va_start(args, format);

    NSMutableAttributedString *mutableAttributedString = (NSMutableAttributedString*)[format mutableCopy];
    NSString *mutableString = [mutableAttributedString string];

    while (true) {
        NSAttributedString *arg = va_arg(args, NSAttributedString*);
        if (!arg) {
            break;
        }
        NSRange rangeOfStringToBeReplaced = [mutableString rangeOfString:@"%@"];
        [mutableAttributedString replaceCharactersInRange:rangeOfStringToBeReplaced withAttributedString:arg];
    }

    va_end(args);

    return mutableAttributedString;
}
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...