Hinzufügen von Attributen zu NSMutableAttributedString von Zeichen
Hier ist meine situation:
Ich habe eine NSMutableAttributedString
ohne Attribute in einem text anzeigen. Wenn der Benutzer drückt die backspace-Taste nicht, ich möchte nicht einen Charakter gelöscht werden, ich will es durch geschlagen werden, genau wie die "Änderungen Verfolgen" - Funktion von Produktivitäts-suites. Ich möchte die Benutzer in der Lage sein, um mit der Eingabe fortfahren in der Regel nach. Hier ist, wie ich begann:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if (text.length == 0 && textView.text.length == 0) return YES;
if (text.length == 0 && !([[textView.text substringFromIndex:textView.text.length - 1] isEqualToString:@" "] || [[textView.text substringFromIndex:textView.text.length - 1] isEqualToString:@"\n"])) {
textView.attributedText = [self strikeText:textView.attributedText];
textView.selectedRange = NSMakeRange(textView.attributedText.length - 1, 0);
return NO;
}
return YES;
}
- (NSAttributedString *)strikeText:(NSAttributedString *)text
{
NSRange range;
NSMutableAttributedString *returnValue = [[NSMutableAttributedString alloc] initWithAttributedString:text];
if (![text attribute:NSStrikethroughStyleAttributeName atIndex:text.length - 1 effectiveRange:&range]) {
NSLog(@"%@", NSStringFromRange(range));
NSLog(@"%@", [text attribute:NSStrikethroughStyleAttributeName atIndex:text.length - 1 effectiveRange:&range]);
[returnValue addAttribute:NSStrikethroughStyleAttributeName value:@(NSUnderlineStyleSingle) range:NSMakeRange(text.length - 1, 1)];
[returnValue addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(text.length - 1, 1)];
}
else {
[returnValue addAttribute:NSStrikethroughStyleAttributeName value:@(NSUnderlineStyleSingle) range:NSMakeRange(range.location - 1, 1)];
[returnValue addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(range.location - 1, 1)];
}
[returnValue removeAttribute:NSStrikethroughStyleAttributeName range:NSMakeRange(returnValue.length, 1)];
return returnValue;
}
Doch egal, wie schwer ich denke, ich kann nicht umbrochen, mein Kopf herum die situation. Dieser code funktioniert nicht, oder funktioniert nur teilweise. Der Rückgabewert von attribute: atIndex: effectiveRange:
ist immer null, egal, ob das Attribut tatsächlich existiert oder nicht. Die effektive Reichweite liegt außerhalb des gültigen Bereichs des Textes, den ich habe.
Bitte helfen Sie mir hier draußen.
InformationsquelleAutor duci9y | 2013-06-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ihrem
strikeText:
Methode, die Sie nur überprüfen Sie das Ende Ihrer attributedString. Wenn Sie möchten, überprüfen Sie die letzten Zeichen, die Sie sollten überprüfen, austext.length -2
, vorausgesetzt, der text ist lang genug. Auch du bist removeAttribute am Ende der Methode nicht so viel Sinn zu mich.Einem einfachen Konzept auf, wie Sie Sie wiederverwenden können, reichen von der Delegate-Protokoll zum Streik nur die Zeichen, die Sie benötigen:
Vielleicht noch weitere Grenzfälle, aber das ist eine einfache Methode, die tut, was Sie wollen.
Ich erklärte den Grund für Ihr problem mit Attribut:atIndex:effectiveRange: im ersten Teil. Der code sollte nicht die vollständige Lösung, aber eine Richtung für Sie weiter mit.
InformationsquelleAutor Karl
Sollten Sie versuchen:
Und Attribute werden hier beschrieben:
https://developer.apple.com/reference/foundation/nsattributedstring/1652619-character_attributes?language=objc
InformationsquelleAutor Jorge Siul Gonzales Gonzales