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

Schreibe einen Kommentar