2014-02-12 12 views
5

Ich schäme mich zugeben, dass ich nicht weiß, wie man eine UITextView löschen.So löschen Sie UITextView ... für echte

Durch Löschen, meine ich, lassen Sie den Text leer und entfernen Sie alle seine Attribute. Ich dachte, es auf nil zu setzen wäre genug, aber die Attribute des ersten Zeichens bleiben dort, warten stillschweigend, bis ich noch einmal tippe, um hinzugefügt zu werden.

Zum Beispiel hat der folgende Code eine Vanille UITextView, die auf Doppeltipp (doubleTapAction:) gelöscht werden kann. Nach dem Laden füge ich ein benutzerdefiniertes Attribut hinzu, das ebenfalls entfernt werden soll, wenn UITextView gelöscht wird.

@implementation HPViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"test"]; 
    [attributedString addAttributes:@{@"attribute" : @"value"} range:NSMakeRange(0, 1)]; 
    self.textView.attributedText = attributedString; 
} 

- (IBAction)doubleTapAction:(id)sender 
{ 
    self.textView.text = nil; 
    // Also tried: 
    // self.textView.text = @""; 
    // self.textView.attributedText = nil; 
    // self.textView.attributedText = [[NSAttributedString alloc] initWithString:@""]; 
} 

- (void)textViewDidChange:(UITextView *)textView 
{ 
    NSLog(@"%@", textView.attributedText); 
} 

@end 

die UITextView Löschen und dann den Buchstaben "d" eingeben protokolliert die folgende:

d{ 
    NSFont = "<UICTFont: 0x8a7e4e0> font-family: \"Helvetica\"; font-weight: normal; font-style: normal; font-size: 12.00pt"; 
    NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n 28L,\n 56L,\n 84L,\n 112L,\n 140L,\n 168L,\n 196L,\n 224L,\n 252L,\n 280L,\n 308L,\n 336L\n), DefaultTabInterval 0, Blocks (null), Lists (null), BaseWritingDirection 0, HyphenationFactor 0, TighteningFactor 0, HeaderLevel 0"; 
    attribute = value; 
} 

Meine benutzerdefinierte Attribut ist immer noch da!

Ist dies ein Fehler oder erwartetes Verhalten?

Antwort

6

Dieser schreckliche Hack funktioniert der Trick:

self.textView.text = @"Something, doesn't matter what as long as it's not empty"; 
self.textView.text = @""; 

Dennoch wäre es schön, zu bestätigen, ob dies ein Fehler oder erwartete Verhalten ist. Ich konnte nichts in der Dokumentation darüber finden.

+1

Dies ist die Art, wie ich es (widerwillig) auch tun. – JMarsh

1

Sie müssen Schriftart, Textfarbe usw. manuell auf Ihre Standardwerte zurücksetzen. Durch das Setzen von attributedText werden die globalen Attribute von UITextView immer auf den ersten Buchstaben der attributierten Zeichenfolge gesetzt.

+0

Wäre die Reset benutzerdefinierten Attribute? Edit: Nein, tut es nicht. Ich frage nach allen Attributen, nicht nur nach Absatz, Farbe und Schriftart. – hpique

+0

Fügen Sie einfach self.textView.textColor = und ähnliche Dinge für jedes Attribut hinzu, das möglicherweise von NSAttributedString geändert wurde. – johnyu

+0

UITextView bietet nur eine Handvoll Attribute. Es ist nicht genug. – hpique

1

In meiner Anwendung habe ich eine schlechte Leistung aus dem Hack sieht von hpique vorgeschlagen:

self.textView.text = @"Something, doesn't matter what as long as it's not empty"; 
self.textView.text = @""; 

Die erste Zeile der UITextView zwingt wieder alles um das Layout. Dies ist kostspielig, wenn das UITextView in einer wiederverwendeten Zelle (z. B. in einem UITableView) verwendet wird.

In iOS 8 und später fand ich es viel mehr performant mit der folgenden Reset-Methode auf meiner UITextView Unterklasse:

- (void)reset 
{  
    self.text = nil; 
    self.font = nil; 
    self.textColor = nil; 
    self.textAlignment = NSTextAlignmentLeft; 
}