Как изменить цвет всех чисел в строке в swift

Я пытаюсь изменить цвет для всех чисел, присутствующих в строке вswift code.Example:

var mystring = "abc 3423 opqrs 474598 lmno 343543"

(изменить цвет всех чисел на красный)

выход:

abc 3423 opqrs 474598 lmno 343543

----- в красном ---------- в красном ----------- в красном ---

 kelin30 мая 2016 г., 09:07
Вы можете использоватьNSScanner или жеNSLinguisticTagger (более сложный), чтобы обнаружить номера.
 sulabh qg30 мая 2016 г., 08:48
да, это работает с помощью addAttributs: range .. спасибо.
 sulabh qg30 мая 2016 г., 08:22
В iphone UILabel, а не в консоли.
 Paulw1130 мая 2016 г., 08:23
Вам нужно посмотреть наNSAttributedString developer.apple.com/library/ios/documentation/Cocoa/Reference/... иattributedText собственностьюUILabel
 Paulw1130 мая 2016 г., 08:07
Где вы пытаетесь отобразить эти цифры? В UILabel? На консоли?
 Lion30 мая 2016 г., 08:23
Хороший вопрос..!!

Ответы на вопрос(5)

но я попытался сделать демонстрацию по цели c, и она отлично работает, как ваше требование, если это может помочь,

  NSString *str = @"abc 3423 opqrs 474598 lmno 343543";

NSMutableAttributedString *str1 = [[NSMutableAttributedString alloc]initWithString:@"abc 3423 opqrs 474598 lmno 343543"];

NSArray *arr = [str componentsSeparatedByString:@" "];

for (int i = 0; i < arr.count; i++) {


    NSString *temp = [arr objectAtIndex:i];

    NSCharacterSet* notDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
    if ([temp rangeOfCharacterFromSet:notDigits].location == NSNotFound)
    {
        NSDictionary *attrs = @{

                                NSForegroundColorAttributeName:[UIColor redColor]
                                };

        NSRange range = [str rangeOfString:[arr objectAtIndex:i]];

        [str1 addAttributes:attrs range:range];
    }


}

UILabel *temp = [[UILabel alloc]initWithFrame:CGRectMake(20, 20, 300, 50)];

[self.view addSubview:temp];

temp.attributedText = str1;

Вы можете использовать логику и концепцию, и можете использовать Swift как ваше требование.

Надеюсь, это поможет :)

 sulabh qg01 июн. 2016 г., 06:43
спасибо лев за ответ ..
 Lion01 июн. 2016 г., 06:45
Пожалуйста...... :)

поэтому, в основном, проверив, является ли это число, и сохраните его местоположение, затем с помощью NSAttributedString мы можем легко изменить цвет символа следующим образом: -

class ViewController: UIViewController {

@IBOutlet weak var mylabel: UILabel!
let numbers = ["0","1","2","3","4","5","6","7","8","9"]
var mystring = "abc 3423 opqrs 474598 lmno 343543"

override func viewDidLoad() {
    super.viewDidLoad()
    let myAttributedString = NSMutableAttributedString(string: "\(self.mystring)")
    var locations: [Int] = []
    let characters = mystring.characters
    var i = 0
    for letter in characters {
        i = i + 1
        letter.debugDescription
        if numbers.contains(String(letter)) {
            locations.append(i)
        }
    }

    for item in locations {
        print(item)
        let myRange = NSRange(location: item - 1, length: 1)
        myAttributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: myRange)
    }
    self.mylabel.attributedText = myAttributedString
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

Вот скриншот

 Zig04 окт. 2016 г., 18:30
@sulabhqg Есть более эффективный способ сделать это удобным для локализации (и более читабельным). Смотрите мой ответ ниже.
 sulabh qg01 июн. 2016 г., 06:43
спасибо chathuranga silva за ответ .. он работает нормально.

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

    let myString = "abc 3423 opqrs 474598 lmno 343543"
    let redFont = [NSForegroundColorAttributeName: UIColor.red]

    let myAttributedString = NSMutableAttributedString()
    for letter in myString.unicodeScalars {
        let myLetter : NSAttributedString
        if CharacterSet.decimalDigits.contains(letter) {
            myLetter = NSAttributedString(string: "\(letter)", attributes: redFont)
        } else {
            myLetter = NSAttributedString(string: "\(letter)")
        }
        myAttributedString.append(myLetter)
    }

    myLabel.attributedText = myAttributedString

В дополнение к большей эффективности проверка членства в CharacterSet.decimalDigits удобна для локализации, если вы намереваетесь это поддерживать.

NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:"Your Text"];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)]; //give range where you want
[string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(5,6)];//give range where you want
[string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(11,5)]; //give range where you want
YourLable.attributedText = string;
 sulabh qg01 июн. 2016 г., 06:44
спасибо тебе, вибха, за твой ответ ... но я ожидал ответа по-быстрому.

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

func findNumberRanges(string: String) -> [NSRange]{
    let nsString = string as NSString
    let regex = try? NSRegularExpression(pattern: "[0-9]+", options: [])
    let matches = regex?.matches(in: string, options: .withoutAnchoringBounds, range: NSMakeRange(0, nsString.length))
    return matches?.map{$0.range} ?? []
}

Затем мы можем перебрать диапазоны чисел, чтобы добавить атрибут, в этом случае установить красный цвет.

func attributedNumberString(string: String, numberAttribute: [String: Any]) -> NSAttributedString{
    let ranges = findNumberRanges(string: string)

    let attributedString = NSMutableAttributedString(string: string)
    for range in ranges{
        attributedString.addAttributes(numberAttribute, range: range)
    }
    return attributedString
}

Вот как это используется:

let redColorAttribute = [ NSForegroundColorAttributeName: UIColor.red]
attributedNumberString(string: "6h40m", numberAttribute: redColorAttribute)

Ваш ответ на вопрос