754 Stimmen

Platzhalter in UITextView

Meine Anwendung verwendet ein UITextView . Jetzt möchte ich die UITextView einen Platzhalter zu haben, der dem Platzhalter ähnelt, den Sie für eine UITextField .

Wie kann man das tun?

0 Stimmen

Der TTTextEditor von Three20 (der seinerseits UITextField verwendet) unterstützt sowohl Platzhaltertext als auch das Wachsen nach Höhe (er wird zu einem UITextView).

0 Stimmen

24 Stimmen

Wie wäre es mit der Kategorie UITextView+Placeholder? github.com/devxoul/UITextView-Platzhalter

21voto

Vaibhav Saran Punkte 12748

Ich empfehle die Verwendung von SZTextView .

https://github.com/glaszig/SZTextView

Fügen Sie Ihren Standard UITextView von storyboard und ändern Sie dann seine benutzerdefinierte Klasse in SZTextView wie unten

enter image description here

Dann sehen Sie zwei neue Optionen in der Attribute Inspector

enter image description here

15voto

Amit Shelgaonkar Punkte 487

Hallo können Sie IQTextView in IQKeyboard Manager ist es einfach zu bedienen und zu integrieren nur Klasse Ihrer textview zu IQTextView und Sie können seine Eigenschaft für die Einstellung Platzhalter Label mit Farbe Sie wollen. Sie können die Bibliothek herunterladen von IQKeyboardManager

oder Sie können es von Cocoapods aus installieren.

0 Stimmen

IQKeyboardManager ist sehr nützlich und codelos. Die beste Antwort für mich!

2 Stimmen

Eigentlich habe ich hochgevotet und einen Kommentar hinterlassen aus dem Grund. Ich weiß nicht, IQTextView ist in IQKeyboardManager vor verfügbar.

0 Stimmen

Ich hatte ein Problem mit dem Delegierten. Ich entfernte aus der Klasse die Überschreibung des Delegaten und die UITextViewDelegate hat einwandfrei funktioniert

12voto

Cristian Bica Punkte 3997

So habe ich es gemacht:

UITextView2.h

#import <UIKit/UIKit.h>

@interface UITextView2 : UITextView <UITextViewDelegate> {
 NSString *placeholder;
 UIColor *placeholderColor;
}

@property(nonatomic, retain) NSString *placeholder;
@property(nonatomic, retain) UIColor *placeholderColor;

-(void)textChanged:(NSNotification*)notif;

@end

UITextView2.m

@implementation UITextView2

@synthesize placeholder, placeholderColor;

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self setPlaceholder:@""];
        [self setPlaceholderColor:[UIColor lightGrayColor]];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextViewTextDidChangeNotification object:nil];
    }
    return self;
}

-(void)textChanged:(NSNotification*)notif {
    if ([[self placeholder] length]==0)
        return;
    if ([[self text] length]==0) {
        [[self viewWithTag:999] setAlpha:1];
    } else {
        [[self viewWithTag:999] setAlpha:0];
    }

}

- (void)drawRect:(CGRect)rect {
    if ([[self placeholder] length]>0) {
        UILabel *l = [[UILabel alloc] initWithFrame:CGRectMake(8, 8, 0, 0)];
        [l setFont:self.font];
        [l setTextColor:self.placeholderColor];
        [l setText:self.placeholder];
        [l setAlpha:0];
        [l setTag:999];
        [self addSubview:l];
        [l sizeToFit];
        [self sendSubviewToBack:l];
        [l release];
    }
    if ([[self text] length]==0 && [[self placeholder] length]>0) {
        [[self viewWithTag:999] setAlpha:1];
    }
    [super drawRect:rect];
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

@end

12voto

aning Punkte 91

Hier ist eine viel einfachere Lösung, die sich genau wie der UITextField-Platzhalter verhält, aber keine benutzerdefinierten Ansichten zeichnen oder den First Responder zurücktreten muss.

- (void) textViewDidChange:(UITextView *)textView{

    if (textView.text.length == 0){
        textView.textColor = [UIColor lightGrayColor];
        textView.text = placeholderText;
        [textView setSelectedRange:NSMakeRange(0, 0)];
        isPlaceholder = YES;

    } else if (isPlaceholder && ![textView.text isEqualToString:placeholderText]) {
        textView.text = [textView.text substringToIndex:1];
        textView.textColor = [UIColor blackColor];
        isPlaceholder = NO;
    }

}

(die zweite Prüfung in der else if-Anweisung ist für den Fall, dass nichts eingegeben wird und der Benutzer die Rücktaste drückt)

Legen Sie einfach Ihre Klasse als UITextViewDelegate fest. In viewDidLoad sollten Sie initialisieren wie

- (void) viewDidLoad{
    // initialize placeholder text
    placeholderText = @"some placeholder";
    isPlaceholder = YES;
    self.someTextView.text = placeholderText;
    self.someTextView.textColor = [UIColor lightGrayColor];
    [self.someTextView setSelectedRange:NSMakeRange(0, 0)];

    // assign UITextViewDelegate
    self.someTextView.delegate = self;
}

2 Stimmen

Die Sache ist die, dass wenn der Benutzer irgendwo in der Mitte des "Platzhaltertextes" tippt, das Caret dort bleibt.

10voto

Shai Mishali Punkte 8096

Sorry, um eine weitere Antwort hinzuzufügen, aber ich habe gerade etwas wie dieses aus und dies erstellt die closest-to-UITextField Art von Platzhalter.

Ich hoffe, das hilft jemandem.

-(void)textViewDidChange:(UITextView *)textView{
    if(textView.textColor == [UIColor lightGrayColor]){
        textView.textColor  = [UIColor blackColor]; // look at the comment section in this answer
        textView.text       = [textView.text substringToIndex: 0];// look at the comment section in this answer
    }else if(textView.text.length == 0){
        textView.text       = @"This is some placeholder text.";
        textView.textColor  = [UIColor lightGrayColor];
        textView.selectedRange = NSMakeRange(0, 0);
    }
}

-(void)textViewDidChangeSelection:(UITextView *)textView{
    if(textView.textColor == [UIColor lightGrayColor] && (textView.selectedRange.location != 0 || textView.selectedRange.length != 0)){
        textView.selectedRange = NSMakeRange(0, 0);
    }
}

1 Stimmen

Ich musste die Reihenfolge der Befehle in der ersten if-Anweisung ändern if(textView.textColor == [UIColor lightGrayColor]){ textView.textColor = [UIColor blackColor]; textView.text = [textView.text substringToIndex: 1]; Andernfalls wurde das erste Zeichen, das in der Textansicht eingegeben wurde, an das Ende des Textes gesetzt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X