it-swarm.com.de

Ersetzen Sie UITextViews-Text durch eine zugewiesene Zeichenfolge

Ich habe eine UITextViewund wenn der Benutzer Text in den Text eingibt, möchte ich den Text im Handumdrehen formatieren. So etwas wie Syntax-Highlighting ...

Dafür möchte ich UITextViewname __... verwenden.

Alles funktioniert gut, ich erwarte ein Problem: Ich nehme den Text aus der Textansicht und mache daraus einen NSAttributedStringname__. Ich bearbeite diesen Attribut-String und setze ihn wieder als textView.attributedText.

Dies geschieht jedes Mal, wenn der Benutzer eingibt. Ich muss mich also an selectedTextRangevor dem Editieren an attributedTexterinnern und es dann wieder zurücksetzen, damit der Benutzer an der Stelle weiter eingeben kann, an der er zuvor eingegeben hat. Das einzige Problem ist, dass, sobald der Text lang genug ist, um zu scrollen, der UITextViewjetzt nach oben scrollen wird, wenn ich langsam tippe.

Hier ist ein Beispielcode:

- (void)formatTextInTextView:(UITextView *)textView
{
  NSRange selectedRange = textView.selectedRange;
  NSString *text = textView.text;

  // This will give me an attributedString with the base text-style
  NSMutableAttributedString *attributedString = [self attributedStringFromString:text];

  NSError *error = nil;
  NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"#(\\w+)" options:0 error:&error];
  NSArray *matches = [regex matchesInString:text
                                    options:0
                                      range:NSMakeRange(0, text.length)];

  for (NSTextCheckingResult *match in matches)
  {
    NSRange matchRange = [match rangeAtIndex:0];
    [attributedString addAttribute:NSForegroundColorAttributeName
                             value:[UIColor redColor]
                             range:matchRange];
  }

  textView.attributedText = attributedString;
  textView.selectedRange = selectedRange;
}

Gibt es eine Lösung, ohne CoreText direkt zu verwenden? Ich mag die UITextViewname__s Fähigkeit, Text und so weiter auszuwählen ....

14
Georg

Ich bin nicht sicher, ob dies die richtige Lösung ist, aber es funktioniert.
Deaktivieren Sie vor dem Formatieren von Text den Bildlauf und aktivieren Sie ihn nach dem Formatieren

- (void)formatTextInTextView:(UITextView *)textView
{
    textView.scrollEnabled = NO;
    NSRange selectedRange = textView.selectedRange;
    NSString *text = textView.text;

    // This will give me an attributedString with the base text-style
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:text];

    NSError *error = nil;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"#(\\w+)" options:0 error:&error];
    NSArray *matches = [regex matchesInString:text
                                      options:0
                                        range:NSMakeRange(0, text.length)];

    for (NSTextCheckingResult *match in matches)
    {
        NSRange matchRange = [match rangeAtIndex:0];
        [attributedString addAttribute:NSForegroundColorAttributeName
                                 value:[UIColor redColor]
                                 range:matchRange];
    }

    textView.attributedText = attributedString;
    textView.selectedRange = selectedRange;
    textView.scrollEnabled = YES;
}
36
Sergey Kuryanov

Benutzte Sergeys 'Antwort selbst und portierte sie nach Swift 2:

func formatTextInTextView(textView: UITextView) {
    textView.scrollEnabled = false
    let selectedRange = textView.selectedRange
    let text = textView.text

    // This will give me an attributedString with the base text-style
    let attributedString = NSMutableAttributedString(string: text)

    let regex = try? NSRegularExpression(pattern: "#(\\w+)", options: [])
    let matches = regex!.matchesInString(text, options: [], range: NSMakeRange(0, text.characters.count))

    for match in matches {
        let matchRange = match.rangeAtIndex(0)
        attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: matchRange)
    }

    textView.attributedText = attributedString
    textView.selectedRange = selectedRange
    textView.scrollEnabled = true
}
4
Tapani

In Swift 4:

func createAttributedText() {
    let stringText = "Test String"
    let stringCount = stringText.count
    let string: NSMutableAttributedString = NSMutableAttributedString(string: stringText)

    string.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: NSMakeRange(0, stringCount))

    self.textView.attributedText =  string
}
0
fugu2

Swift 2.0:

let myDisplayTxt:String = "Test String"

    let string: NSMutableAttributedString = NSMutableAttributedString(string: self.myDisplayTxt)
    string.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSMakeRange(0, 5))
    string.addAttribute(String(kCTForegroundColorAttributeName), value: UIColor.redColor().CGColor as AnyObject, range: NSMakeRange(0, 5))

    self.sampleTextView.attributedText =  string
0
A.G