ইউআইটিেক্সটভিউতে স্থানধারক


717

আমার অ্যাপ্লিকেশন একটি ব্যবহার করে UITextView । এখন আমি চাই যে UITextViewআপনি যেটির জন্য সেট করতে পারেন তার মতো একটি প্লেসোল্ডার রয়েছেUITextField

এই কিভাবে করবেন?


থ্রি 20 এর টিটি টেক্সটএডিটর (নিজেই ইউআইটিেক্সটফিল্ড ব্যবহার করে) স্থানধারক পাঠ্যটির পাশাপাশি উচ্চতা বৃদ্ধির সাথেও সমর্থন করে (এটি ইউআইটিেক্সটভিউতে রূপান্তরিত হয়)।
জোশ বেনিয়ামিন


20
ইউআইটিেক্সটভিউ + প্লেসহোল্ডার বিভাগটি কীভাবে ব্যবহার করবেন? github.com/devxoul/UITextView-Placeholder
devxoul

2
আমি @ ডিভক্সুলের সমাধান কোজকে সমর্থন করছি এটি সাবক্লাস নয়, বিভাগ ব্যবহার করে। এবং এটি আইবি'র পরিদর্শকটিতে 'স্থানধারক' বিকল্পগুলির জন্য (স্থানধারক পাঠ্য ও পাঠ্য রঙ) একটি ক্ষেত্র তৈরি করে। এটি কিছু বাঁধাই কৌশল ব্যবহার করে। কি দুর্দান্ত কোড
samthui7

আপনি যদি UITextViewসমাধানটি ব্যবহার করছেন তবে একেবারেই আলাদা হয়ে যাবে। এখানে কয়েকটি সমাধান দেওয়া হল। ভাসমান প্লেসহোল্ডার এবং জাল দেশীয় প্লেসহোল্ডার
clearlight

উত্তর:


672

কোনও Xibফাইল থেকে প্রারম্ভিককরণের জন্য , পাঠ্য মোড়ানো, এবং পটভূমির রঙ বজায় রাখার জন্য আমি বিসিডির সমাধানটিতে কিছু ছোটখাট পরিবর্তন করেছি । আশা করি এটি অন্যদের ঝামেলা রক্ষা করবে।

UIPlaceHolderTextView.h:

#import <Foundation/Foundation.h>
IB_DESIGNABLE
@interface UIPlaceHolderTextView : UITextView

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

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

@end

UIPlaceHolderTextView.m:

#import "UIPlaceHolderTextView.h"

@interface UIPlaceHolderTextView ()

@property (nonatomic, retain) UILabel *placeHolderLabel;

@end

@implementation UIPlaceHolderTextView

CGFloat const UI_PLACEHOLDER_TEXT_CHANGED_ANIMATION_DURATION = 0.25;

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
#if __has_feature(objc_arc)
#else
    [_placeHolderLabel release]; _placeHolderLabel = nil;
    [_placeholderColor release]; _placeholderColor = nil;
    [_placeholder release]; _placeholder = nil;
    [super dealloc];
#endif
}

- (void)awakeFromNib
{
    [super awakeFromNib];

    // Use Interface Builder User Defined Runtime Attributes to set
    // placeholder and placeholderColor in Interface Builder.
    if (!self.placeholder) {
        [self setPlaceholder:@""];
    }

    if (!self.placeholderColor) {
        [self setPlaceholderColor:[UIColor lightGrayColor]];
    }

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextViewTextDidChangeNotification object:nil];
}

- (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 *)notification
{
    if([[self placeholder] length] == 0)
    {
        return;
    }

    [UIView animateWithDuration:UI_PLACEHOLDER_TEXT_CHANGED_ANIMATION_DURATION animations:^{
    if([[self text] length] == 0)
    {
        [[self viewWithTag:999] setAlpha:1];
    }
    else
    {
        [[self viewWithTag:999] setAlpha:0];
    }
    }];
}

- (void)setText:(NSString *)text {
    [super setText:text];
    [self textChanged:nil];
}

- (void)drawRect:(CGRect)rect
{
    if( [[self placeholder] length] > 0 )
    {
        if (_placeHolderLabel == nil )
        {
            _placeHolderLabel = [[UILabel alloc] initWithFrame:CGRectMake(8,8,self.bounds.size.width - 16,0)];
            _placeHolderLabel.lineBreakMode = NSLineBreakByWordWrapping;
            _placeHolderLabel.numberOfLines = 0;
            _placeHolderLabel.font = self.font;
            _placeHolderLabel.backgroundColor = [UIColor clearColor];
            _placeHolderLabel.textColor = self.placeholderColor;
            _placeHolderLabel.alpha = 0;
            _placeHolderLabel.tag = 999;
            [self addSubview:_placeHolderLabel];
        }

        _placeHolderLabel.text = self.placeholder;
        [_placeHolderLabel sizeToFit];
        [self sendSubviewToBack:_placeHolderLabel];
    }

    if( [[self text] length] == 0 && [[self placeholder] length] > 0 )
    {
        [[self viewWithTag:999] setAlpha:1];
    }

    [super drawRect:rect];
}

@end

2
কিছু ক্ষেত্রে (যেমন আইওএস 5 সামঞ্জস্য) পেস্টকে ওভাররাইড করতে হবে: - (বাতিল) পেস্ট: (আইডি) প্রেরক {[সুপার পেস্ট: প্রেরক]; [স্ব টেক্সট চেঞ্জড: শূন্য]; }
মার্টিন অ্যালরিচ

3
ভাল জিনিস! এনএসএসটিংয়ের জন্য সেরা অনুশীলনের (বা যে কোনও শ্রেণীর NSMutableXXX সমতুল্য রয়েছে) সম্পর্কে অনুস্মারক, সম্পত্তি "অনুলিপি" হওয়া উচিত এবং "ধরে রাখা" নয়।
ওলি

2
আপনি এই কোডটি কীভাবে ইনস্ট্যান্ট করবেন? আমি টাইপ করা শুরু করার সময় কোনও স্থানধারক পাঠ্য দেখতে পাই না এবং কিছুই পরিষ্কার হয় না।
ব্যবহারকারী 798719

40
এটি একটি খুব, খুব দুর্বল লিখিত বাস্তবায়ন। এখানে একটি বিরাট ক্লিনার সংস্করণ রয়েছে যা ডিক্টশন
cbowns

10
ড্রয়ারেক্টে ভিউ হায়ারার্কি সংশোধন করবেন না।
কর্মে

634

সহজ উপায়, কেবল UITextViewনীচের UITextViewDelegateপদ্ধতিগুলি ব্যবহার করে স্থানধারক পাঠ্য তৈরি করুন :

- (void)textViewDidBeginEditing:(UITextView *)textView
{
    if ([textView.text isEqualToString:@"placeholder text here..."]) {
         textView.text = @"";
         textView.textColor = [UIColor blackColor]; //optional
    }
    [textView becomeFirstResponder];
}

- (void)textViewDidEndEditing:(UITextView *)textView
{
    if ([textView.text isEqualToString:@""]) {
        textView.text = @"placeholder text here...";
        textView.textColor = [UIColor lightGrayColor]; //optional
    }
    [textView resignFirstResponder];
}

ঠিক myUITextViewউদাহরণস্বরূপ সৃষ্টির উপর সঠিক পাঠ্যটি সেট করে রাখতে ভুলবেন না

UITextView *myUITextView = [[UITextView alloc] init];
myUITextView.delegate = self;
myUITextView.text = @"placeholder text here...";
myUITextView.textColor = [UIColor lightGrayColor]; //optional

এবং UITextViewDelegateএই পদ্ধতিগুলি অন্তর্ভুক্ত করার আগে পিতামাতার ক্লাসটি তৈরি করুন

@interface MyClass () <UITextViewDelegate>
@end

সুইফট ৩.১ এর জন্য কোড

func textViewDidBeginEditing(_ textView: UITextView) 
{
    if (textView.text == "placeholder text here..." && textView.textColor == .lightGray)
    {
        textView.text = ""
        textView.textColor = .black
    }
    textView.becomeFirstResponder() //Optional
}

func textViewDidEndEditing(_ textView: UITextView)
{
    if (textView.text == "")
    {
        textView.text = "placeholder text here..."
        textView.textColor = .lightGray
    }
    textView.resignFirstResponder()
}

ঠিক myUITextViewউদাহরণস্বরূপ সৃষ্টির উপর সঠিক পাঠ্যটি সেট করে রাখতে ভুলবেন না

 let myUITextView = UITextView.init()
 myUITextView.delegate = self
 myUITextView.text = "placeholder text here..."
 myUITextView.textColor = .lightGray

এবং UITextViewDelegateএই পদ্ধতিগুলি অন্তর্ভুক্ত করার আগে পিতামাতার ক্লাসটি তৈরি করুন

class MyClass: UITextViewDelegate
{

}

1
1 টি ইউআইটিেক্সটভিউ সহ 1 স্ক্রিনের জন্য এটি দুর্দান্ত (আমি সাধারণ পছন্দ করি)। আরও জটিল সমাধানের কারণ হ'ল যদি আপনার অনেকগুলি পর্দা এবং অনেকগুলি ইউআইটিএক্সটভিউ সহ একটি বৃহত্তর অ্যাপ থাকে তবে আপনি এটি বার বার করতে চান না। আপনার প্রয়োজন অনুসারে আপনি সম্ভবত UITextView সাবক্লাস করতে চান এবং তারপরে এটি ব্যবহার করতে পারেন।
ঘোস্ট্যাট্রন

42
যদি কেউ পাঠ্য বাক্সে "স্থানধারক পাঠ্য এখানে ..." টাইপ করেন তবে এটি স্থানধারক পাঠকের মতো আচরণ করে। এছাড়াও, জমা দেওয়ার সময় আপনাকে সেই সমস্ত মানদণ্ড পরীক্ষা করতে হবে।
অনিন্দ্য সেনগুপ্ত

7
ক্ষেত্রটি প্রতিক্রিয়াশীল হয়ে উঠলেও স্থানধারক পাঠ্যটি দেখানোর কথা রয়েছে এবং এই পদ্ধতিটি এর জন্য কাজ করবে না।
ফাতেমন

17
@ জেকএলপি আমি যুক্তি দিয়ে বলব যে "ওভার ইঞ্জিনিয়ারড" উপায়টি পরিষ্কার এবং আরও পুনরায় ব্যবহারযোগ্য ... এবং দেখে মনে হচ্ছে এটি textপাঠ্যদর্শনটির বৈশিষ্ট্যটির সাথে কোনও প্রকার ছড়িয়ে পড়ে না যা দারুণ সুন্দর..এইদিকে এই পদ্ধতিতে এটি পরিবর্তন করে
ক্যামেরন অ্যাস্কিউ

2
প্রতিনিধি পদ্ধতিতে ফার্স্ট রেসপন্ডার এবং পদত্যাগের জন্য ফার্স্ট রেসপন্ডার হওয়ার আহ্বান কেন?
অ্যাডাম জনস

119

কিছুটা ভারী হওয়ায় পোস্ট করা সমাধানগুলির মধ্যে আমি খুব খুশি ছিলাম না। ভিউতে ভিউ যুক্ত করা সত্যই আদর্শ নয় (বিশেষত drawRect:) তাদের দুজনেরই ফাঁস হয়েছিল, যা গ্রহণযোগ্যও নয়।

এখানে আমার সমাধান: SAMTextView

SAMTextView.h

//
//  SAMTextView.h
//  SAMTextView
//
//  Created by Sam Soffes on 8/18/10.
//  Copyright 2010-2013 Sam Soffes. All rights reserved.
//

#import <UIKit/UIKit.h>

/**
 UITextView subclass that adds placeholder support like UITextField has.
 */
@interface SAMTextView : UITextView

/**
 The string that is displayed when there is no other text in the text view.

 The default value is `nil`.
 */
@property (nonatomic, strong) NSString *placeholder;

/**
 The color of the placeholder.

 The default is `[UIColor lightGrayColor]`.
 */
@property (nonatomic, strong) UIColor *placeholderTextColor;

/**
 Returns the drawing rectangle for the text views’s placeholder text.

 @param bounds The bounding rectangle of the receiver.
 @return The computed drawing rectangle for the placeholder text.
 */
- (CGRect)placeholderRectForBounds:(CGRect)bounds;

@end

SAMTextView.m

//
//  SAMTextView.m
//  SAMTextView
//
//  Created by Sam Soffes on 8/18/10.
//  Copyright 2010-2013 Sam Soffes. All rights reserved.
//

#import "SAMTextView.h"

@implementation SAMTextView

#pragma mark - Accessors

@synthesize placeholder = _placeholder;
@synthesize placeholderTextColor = _placeholderTextColor;

- (void)setText:(NSString *)string {
  [super setText:string];
  [self setNeedsDisplay];
}


- (void)insertText:(NSString *)string {
  [super insertText:string];
  [self setNeedsDisplay];
}


- (void)setAttributedText:(NSAttributedString *)attributedText {
  [super setAttributedText:attributedText];
  [self setNeedsDisplay];
}


- (void)setPlaceholder:(NSString *)string {
  if ([string isEqual:_placeholder]) {
    return;
  }

  _placeholder = string;
  [self setNeedsDisplay];
}


- (void)setContentInset:(UIEdgeInsets)contentInset {
  [super setContentInset:contentInset];
  [self setNeedsDisplay];
}


- (void)setFont:(UIFont *)font {
  [super setFont:font];
  [self setNeedsDisplay];
}


- (void)setTextAlignment:(NSTextAlignment)textAlignment {
  [super setTextAlignment:textAlignment];
  [self setNeedsDisplay];
}


#pragma mark - NSObject

- (void)dealloc {
  [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidChangeNotification object:self];
}


#pragma mark - UIView

- (id)initWithCoder:(NSCoder *)aDecoder {
  if ((self = [super initWithCoder:aDecoder])) {
    [self initialize];
  }
  return self;
}


- (id)initWithFrame:(CGRect)frame {
  if ((self = [super initWithFrame:frame])) {
    [self initialize];
  }
  return self;
}


- (void)drawRect:(CGRect)rect {
  [super drawRect:rect];

  if (self.text.length == 0 && self.placeholder) {
    rect = [self placeholderRectForBounds:self.bounds];

    UIFont *font = self.font ? self.font : self.typingAttributes[NSFontAttributeName];

    // Draw the text
    [self.placeholderTextColor set];
    [self.placeholder drawInRect:rect withFont:font lineBreakMode:NSLineBreakByTruncatingTail alignment:self.textAlignment];
  }
}


#pragma mark - Placeholder

- (CGRect)placeholderRectForBounds:(CGRect)bounds {
  // Inset the rect
  CGRect rect = UIEdgeInsetsInsetRect(bounds, self.contentInset);

  if (self.typingAttributes) {
    NSParagraphStyle *style = self.typingAttributes[NSParagraphStyleAttributeName];
    if (style) {
      rect.origin.x += style.headIndent;
      rect.origin.y += style.firstLineHeadIndent;
    }
  }

  return rect;
}


#pragma mark - Private

- (void)initialize {
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextViewTextDidChangeNotification object:self];

  self.placeholderTextColor = [UIColor colorWithWhite:0.702f alpha:1.0f];
}


- (void)textChanged:(NSNotification *)notification {
  [self setNeedsDisplay];
}

@end

এটি অন্যদের তুলনায় অনেক সহজ, কারণ এটি সাবভিউ (বা ফুটো আছে) ব্যবহার করে না। এটি বিনামূল্যে নির্দ্বিধায়।

11-10/11 আপডেট করুন: এটি এখন ডকুমেন্টেড এবং ইন্টারফেস বিল্ডারে ব্যবহার সমর্থন করে।

11/24/13 আপডেট করুন: নতুন রেপোতে পয়েন্ট করুন।


আমি আপনার সমাধানটি পছন্দ করি, এবং setTextপাঠ্য সম্পত্তিটি প্রোগ্রামক্রমে পরিবর্তন করার সময় আমি স্থানধারককে আপডেট করার জন্য একটি ওভাররাইড যুক্ত করেছি : - (শূন্য) সেটটেক্সট: (এনএসএসআরটিং *) স্ট্রিং {[সুপার সেটটেক্সট: স্ট্রিং]; [স্ব _পেটেটশোল্ডড্রাপপ্লেসোল্ডার]; }
olegueret

1
আমি আপনার সমাধানটিও খুব পছন্দ করি তবে আপনি জাগ্রত ক্রোমনিব পদ্ধতিটি মিস করেছেন যাতে আপনার ডিআইডি পদ্ধতিটি সর্বদা কল হয় না। আমি এখানকার অন্য একজনের কাছ থেকে এটি নিয়েছি।
toxaq

দ্রষ্টব্য - ম্যাজিক নম্বরগুলি হরফ আকারের উপর নির্ভর করে পরিবর্তিত হবে। হরফ পজিশনিং ফন্ট থেকে গণনা করা যেতে পারে, তবে সম্ভবত এই বাস্তবায়নের জন্য এটি উপযুক্ত নয়। কোনও পাঠ্য না থাকলে স্থানধারকের সঠিক অবস্থান কার্সার পজিশনের ডানদিকে 2 পেক্স হতে হবে।
স্মরণে 21 '

নিব থেকে লোডিং সমাধান করার জন্য: আপনি সম্ভবত একটি - (আইডি) initWithCoder যুক্ত করতে চান: (এনএসকোডার *) aDecoder; প্রারম্ভিক এক সাথে বিদ্যমান।
জরিস ক্লুয়েভারস

এটা মিষ্টি. notificationযুক্তি, গত পদ্ধতিতে বানান ভুল যদিও, এবং এটা একটি সম্পাদনা হিসাবে জমা দিতে খুবই ছোট একটা পরিবর্তন আছে।
ফিল ক্যালভিন

53

আমি কোনও স্থানধারককে অনুকরণ করার খুব সহজ উপায় খুঁজে পেয়েছি

  1. এনআইবি বা কোডটিতে আপনার পাঠ্যদর্শনটির পাঠ্য রঙ হালকা গ্রে কালারে সেট করুন (বেশিরভাগ সময়)
  2. আপনার টেক্সটভিউয়ের প্রতিনিধিটি ফাইলের মালিকের সাথে সংযুক্ত রয়েছে এবং আপনার হেডার ফাইলে ইউআইটিএক্সেক্সটভিউডেলিগেটটি প্রয়োগ করেছে তা নিশ্চিত করুন
  3. আপনার পাঠ্য দর্শনটির ডিফল্ট পাঠ্য এতে সেট করুন (উদাহরণস্বরূপ: "ফুবার স্থানধারক")
  4. প্রয়োগ করুন: (BOOL) পাঠ্য ভিউ শল্ডবাগিন সম্পাদনা: (ইউআইটিেক্সটভিউ *) পাঠ্যদর্শন

সম্পাদনা:

বিবৃতি পাঠ্যের পরিবর্তে ট্যাগের তুলনা করতে পরিবর্তন করা হয়েছে। যদি ব্যবহারকারী তাদের পাঠ্য মুছে ফেলেন তবে দুর্ঘটনাক্রমে স্থানধারকের একটি অংশ মুছতে @"Foobar placeholder"পারা সম্ভব ছিল hisএর অর্থ ব্যবহারকারী যদি নিম্নলিখিত প্রতিনিধি পদ্ধতিতে পাঠ্যটি আবার প্রবেশ করেন -(BOOL) textViewShouldBeginEditing:(UITextView *) textView, এটি প্রত্যাশার মতো কাজ করবে না। আমি যদি বিবৃতিতে পাঠ্যের রঙের সাথে তুলনা করার চেষ্টা করেছি তবে দেখলাম যে ইন্টারফেস বিল্ডারে হালকা ধূসর রঙের সেটটি কোডের সাথে হালকা ধূসর বর্ণের সেটের মতো নয় with[UIColor lightGreyColor]

- (BOOL) textViewShouldBeginEditing:(UITextView *)textView
{
    if(textView.tag == 0) {
        textView.text = @"";
        textView.textColor = [UIColor blackColor];
        textView.tag = 1;
    }
    return YES;
}

কীবোর্ড এবং [পাঠ্য দেখার দৈর্ঘ্য] == 0 এলে স্থানধারক পাঠ্য পুনরায় সেট করাও সম্ভব

সম্পাদনা করুন:

কেবল শেষ অংশটি পরিষ্কার করার জন্য - আপনি কীভাবে স্থানধারক পাঠ্য সেট করতে পারেন তা এখানে:

- (void)textViewDidChange:(UITextView *)textView
{
   if([textView.text length] == 0)
   {
       textView.text = @"Foobar placeholder";
       textView.textColor = [UIColor lightGrayColor];
       textView.tag = 0;
   }
}

12
আমি এই পদ্ধতির খুব পছন্দ করি! উপরের সম্পাদনাটির জন্য আমি কেবলমাত্র যা করব তা হ'ল বাস্তবায়নটিকে পাঠ্য ভিউডিড চ্যাঞ্জ: পদ্ধতি এবং টেক্সটভিউইডএন্ডইডিটিং: পদ্ধতিতে সরিয়ে নেওয়া হবে, যাতে আপনি যখন অবজেক্টটির সাথে কাজ শেষ করেছেন কেবল প্লেসহোল্ডার পাঠ্যটি কেবল ফিরে আসে।
অশ্বশী 7

52

আপনি কি করতে পারেন কিছু প্রাথমিক মান পাঠ্য দৃশ্য সেট আপ করা হয়েছে textসম্পত্তি, এবং পরিবর্তন textColorকরতে [UIColor grayColor]বা অনুরূপ কিছু। তারপরে, যখনই পাঠ্য দর্শনটি সম্পাদনাযোগ্য হয়, পাঠটি সাফ করুন এবং একটি কার্সার উপস্থাপন করুন এবং যদি পাঠ্য ক্ষেত্রটি আবার খালি হয় তবে আপনার স্থানধারক পাঠ্যটি পিছনে রাখুন। এতে রঙ পরিবর্তন করুন[UIColor blackColor]উপযুক্ত হিসাবে ।

এটি কোনও ইউআইটিেক্সটফিল্ডে স্থানধারকের কার্যকারিতার মতো নয়, তবে এটি কাছে।


9
আমি সর্বদা লাইটগ্রায়ার কালার ব্যবহার করেছি , যা মনে হয় স্থানধারক পাঠ্যের রঙের সাথে মেলে।
বিল

আমি এখন এটি পড়ছি, তবে আমি যুক্ত করতে চাই যে রঙটি কালো রঙে পুনরায় সেট করা এবং পাঠ্য ভিউশল্ডব্যাগেইন সম্পাদনা: (ইউআইটিএসটিভিউ *) টেক্সটভিউটি খুব ভালভাবে কাজ করে the নীচের সমাধানগুলির তুলনায় এটি একটি খুব সুন্দর এবং দ্রুত সমাধান (তবে নীচে এখনও মার্জিত সমাধান, ইউটেক্সটভিউ উপশ্রুত করা uch আরও বেশি মডুলার)।
এনরিকো সুস্যাতিयो

3
সত্য, তবে এটি ইউআইটিেক্সটফিল্ডের আচরণের নকল করে না, যা যখন ব্যবহারকারী কিছু সম্পাদন করে তখনই তার স্থানধারক পাঠ্যটির পরিবর্তিত করে, সম্পাদনা শুরু করার সময় নয়, এবং যা স্থানধারককে আবার যুক্ত করে দ্বিতীয় দৃশ্যটি ফাঁকা থাকে, সম্পাদনাটি আসলে শেষ না হয়ে না।
অ্যাশ


45

কারও যদি সুইফ্টের জন্য সমাধানের প্রয়োজন হয়:

আপনার শ্রেণিতে UITextViewDelegate যুক্ত করুন

var placeHolderText = "Placeholder Text..."

override func viewDidLoad() {
    super.viewDidLoad()
    textView.delegate = self
}

func textViewShouldBeginEditing(textView: UITextView) -> Bool {

    self.textView.textColor = .black

    if(self.textView.text == placeHolderText) {
        self.textView.text = ""
    }

    return true
}

func textViewDidEndEditing(textView: UITextView) {
    if(textView.text == "") {
        self.textView.text = placeHolderText
        self.textView.textColor = .lightGray
    }
}

override func viewWillAppear(animated: Bool) {

    if(currentQuestion.answerDisplayValue == "") {
        self.textView.text = placeHolderText
        self.textView.textColor = .lightGray
    } else {
        self.textView.text = "xxx" // load default text / or stored 
        self.textView.textColor = .black
    }
}

এটি ঠিক আছে তবে যথেষ্ট ভাল নয়। যদি ব্যবহারকারী "প্লেসহোল্ডার পাঠ্য ..." টাইপ করেন (প্রান্তের ক্ষেত্রে স্পষ্টতই), এটি আপনার যুক্তিটিকে ভেঙে দেয়
লুকাস চ্বে

45

সাধারণ সুইফট 3 সমাধান

যোগ UITextViewDelegate আপনার ক্লাসে

সেট yourTextView.delegate = self

এটি তৈরি করুন placeholderLabelএবং এর ভিতরে অবস্থান করুনyourTextView

এখন কেবল এনিমেট placeholderLabel.alphaকরুন textViewDidChange:

  func textViewDidChange(_ textView: UITextView) {
    let newAlpha: CGFloat = textView.text.isEmpty ? 1 : 0
    if placeholderLabel.alpha != newAlpha {
      UIView.animate(withDuration: 0.3) {
        self.placeholderLabel.alpha = newAlpha
      }
    }
  }

placeholderLabelএটি সঠিকভাবে সেট আপ করার জন্য আপনাকে পজিশনের সাথে খেলতে হতে পারে , তবে এটি খুব বেশি কঠিন হওয়া উচিত নয়


1
দুর্দান্ত উত্তর, সহজ সমাধান। আমি যখন আলফা পরিবর্তন হওয়া উচিত তখনই প্রাণবন্ত করার জন্য আমি একটি ছোট উন্নতি যুক্ত করেছি: let alpha = CGFloat(textView.text.isEmpty ? 1.0 : 0.0) if alpha != lblPlaceholder.alpha { UIView.animate(withDuration: 0.3) { self.lblPlaceholder.alpha = alpha } }
লুসিয়ানো স্ক্লোভস্কি

24

আমি কেএমকেন্ডির উত্তরটি প্রসারিত করেছি, যাতে ব্যবহারকারী UITextViewকেবলমাত্র ট্যাপ করার পরিবর্তে ব্যবহারকারী সম্পাদনা শুরু না করা প্লেসোল্ডারটি দৃশ্যমান থাকে । এটি টুইটার এবং ফেসবুক অ্যাপ্লিকেশনগুলিতে কার্যকারিতা আয়না করে। আমার সমাধানটি আপনাকে সাবক্লাসের প্রয়োজন হয় না এবং যদি ব্যবহারকারী সরাসরি টাইপ করে বা পাঠ্য পাঠ্য করে!

স্থানধারকের উদাহরণ টুইটার অ্যাপ

- (void)textViewDidChangeSelection:(UITextView *)textView{
    if ([textView.text isEqualToString:@"What's happening?"] && [textView.textColor isEqual:[UIColor lightGrayColor]])[textView setSelectedRange:NSMakeRange(0, 0)];

}

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

    [textView setSelectedRange:NSMakeRange(0, 0)];
}

- (void)textViewDidChange:(UITextView *)textView
{
    if (textView.text.length != 0 && [[textView.text substringFromIndex:1] isEqualToString:@"What's happening?"] && [textView.textColor isEqual:[UIColor lightGrayColor]]){
        textView.text = [textView.text substringToIndex:1];
        textView.textColor = [UIColor blackColor]; //optional

    }
    else if(textView.text.length == 0){
        textView.text = @"What's happening?";
        textView.textColor = [UIColor lightGrayColor];
        [textView setSelectedRange:NSMakeRange(0, 0)];
    }
}

- (void)textViewDidEndEditing:(UITextView *)textView
{
    if ([textView.text isEqualToString:@""]) {
        textView.text = @"What's happening?";
        textView.textColor = [UIColor lightGrayColor]; //optional
    }
    [textView resignFirstResponder];
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
    if (textView.text.length > 1 && [textView.text isEqualToString:@"What's happening?"]) {
         textView.text = @"";
         textView.textColor = [UIColor blackColor];
    }

    return YES;
}

মনে রাখবেন, যেমন তৈরির জন্য সঠিক পাঠ্য সহ MyUITextView সেট করুন

UITextView *myUITextView = [[UITextView alloc] init];
myUITextView.delegate = self;
myUITextView.text = @"What's happening?";
myUITextView.textColor = [UIColor lightGrayColor]; //optional

এবং এই পদ্ধতিগুলি অন্তর্ভুক্ত করার আগে প্যারেন্ট ক্লাসকে একটি ইউআইটিএক্সেক্সটভিউ প্রতিনিধি করুন

@interface MyClass () <UITextViewDelegate>
@end

20

আমি ব্যবহার করার পরামর্শ দিচ্ছি SZTextView

https://github.com/glaszig/SZTextView

UITextViewথেকে আপনার ডিফল্ট যুক্ত করুন storyboardএবং তার কাস্টম ক্লাসটি SZTextViewনীচে like পছন্দ করতে পরিবর্তন করুন 👇👇👇👇

এখানে চিত্র বর্ণনা লিখুন

তারপরে আপনি in এ দুটি নতুন বিকল্প দেখতে পাবেন Attribute Inspector👇👇👇👇

এখানে চিত্র বর্ণনা লিখুন


20

নীচে "স্যামটেক্সটভিউ" ওবিজেসি কোডের একটি সুইফ্ট বন্দরটি প্রশ্নের প্রথম থাবা উত্তরগুলির মধ্যে একটি হিসাবে পোস্ট করা হয়েছে। আমি এটি আইওএস ৮-এ পরীক্ষা করেছি I মূল স্থানটি অনেক বেশি এবং খুব দূরে ডান হওয়ায়, স্থানধারক পাঠকের স্থান নির্ধারণের জন্য সীমানাটি অফসেট সহ আমি বেশ কয়েকটি জিনিস টুইট করেছি that সেই পোস্টের মন্তব্যের একটিতে ব্যবহৃত পরামর্শ)।

আমি জানি যে অনেকগুলি সহজ সমাধান রয়েছে তবে আমি ইউআইটিেক্সটভিউতে সাবক্লাসিংয়ের পদ্ধতিটি পছন্দ করি কারণ এটি পুনরায় ব্যবহারযোগ্য এবং এটি প্রক্রিয়াগুলির সাহায্যে আমার ক্লাস্টার ক্লাস করতে হবে না।

সুইফট ২.২:

import UIKit

class PlaceholderTextView: UITextView {

    @IBInspectable var placeholderColor: UIColor = UIColor.lightGrayColor()
    @IBInspectable var placeholderText: String = ""

    override var font: UIFont? {
        didSet {
            setNeedsDisplay()
        }
    }

    override var contentInset: UIEdgeInsets {
        didSet {
            setNeedsDisplay()
        }
    }

    override var textAlignment: NSTextAlignment {
        didSet {
            setNeedsDisplay()
        }
    }

    override var text: String? {
        didSet {
            setNeedsDisplay()
        }
    }

    override var attributedText: NSAttributedString? {
        didSet {
            setNeedsDisplay()
        }
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setUp()
    }

    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)
    }

    private func setUp() {
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(PlaceholderTextView.textChanged(_:)),
                                                         name: UITextViewTextDidChangeNotification, object: self)
    }

    func textChanged(notification: NSNotification) {
        setNeedsDisplay()
    }

    func placeholderRectForBounds(bounds: CGRect) -> CGRect {
        var x = contentInset.left + 4.0
        var y = contentInset.top  + 9.0
        let w = frame.size.width - contentInset.left - contentInset.right - 16.0
        let h = frame.size.height - contentInset.top - contentInset.bottom - 16.0

        if let style = self.typingAttributes[NSParagraphStyleAttributeName] as? NSParagraphStyle {
            x += style.headIndent
            y += style.firstLineHeadIndent
        }
        return CGRect(x: x, y: y, width: w, height: h)
    }

    override func drawRect(rect: CGRect) {
        if text!.isEmpty && !placeholderText.isEmpty {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.alignment = textAlignment
            let attributes: [ String: AnyObject ] = [
                NSFontAttributeName : font!,
                NSForegroundColorAttributeName : placeholderColor,
                NSParagraphStyleAttributeName  : paragraphStyle]

            placeholderText.drawInRect(placeholderRectForBounds(bounds), withAttributes: attributes)
        }
        super.drawRect(rect)
    }
}

সুইফট 4.2:

import UIKit

class PlaceholderTextView: UITextView {

    @IBInspectable var placeholderColor: UIColor = UIColor.lightGray
    @IBInspectable var placeholderText: String = ""

    override var font: UIFont? {
        didSet {
            setNeedsDisplay()
        }
    }

    override var contentInset: UIEdgeInsets {
        didSet {
            setNeedsDisplay()
        }
    }

    override var textAlignment: NSTextAlignment {
        didSet {
            setNeedsDisplay()
        }
    }

    override var text: String? {
        didSet {
            setNeedsDisplay()
        }
    }

    override var attributedText: NSAttributedString? {
        didSet {
            setNeedsDisplay()
        }
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setUp()
    }

    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)
    }

    private func setUp() {
        NotificationCenter.default.addObserver(self,
         selector: #selector(self.textChanged(notification:)),
         name: Notification.Name("UITextViewTextDidChangeNotification"),
         object: nil)
    }

    @objc func textChanged(notification: NSNotification) {
        setNeedsDisplay()
    }

    func placeholderRectForBounds(bounds: CGRect) -> CGRect {
        var x = contentInset.left + 4.0
        var y = contentInset.top  + 9.0
        let w = frame.size.width - contentInset.left - contentInset.right - 16.0
        let h = frame.size.height - contentInset.top - contentInset.bottom - 16.0

        if let style = self.typingAttributes[NSAttributedString.Key.paragraphStyle] as? NSParagraphStyle {
            x += style.headIndent
            y += style.firstLineHeadIndent
        }
        return CGRect(x: x, y: y, width: w, height: h)
    }

    override func draw(_ rect: CGRect) {
        if text!.isEmpty && !placeholderText.isEmpty {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.alignment = textAlignment
            let attributes: [NSAttributedString.Key: Any] = [
            NSAttributedString.Key(rawValue: NSAttributedString.Key.font.rawValue) : font!,
            NSAttributedString.Key(rawValue: NSAttributedString.Key.foregroundColor.rawValue) : placeholderColor,
            NSAttributedString.Key(rawValue: NSAttributedString.Key.paragraphStyle.rawValue)  : paragraphStyle]

            placeholderText.draw(in: placeholderRectForBounds(bounds: bounds), withAttributes: attributes)
        }
        super.draw(rect)
    }
}

সুইফ্ট সংস্করণটি করার জন্য ধন্যবাদ, আপনি কি জাগ্রত থেকে নেওয়া উচিত যা কেবল সুপারকে কল করে যাবেন?
পিয়েরে

এটি স্থানধারক সেট করে, তবে আপনি টাইপ শুরু করার পরে আপডেট হয় না।
ডেভিড

কিছুই নয়, আমি জাগ্রত থেকে নোটিফিকেশন কলটি রেখেছি এবং এটি এখন কাজ করে।
ডেভিড

12

এইভাবে আমি এটি করেছি:

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

12

এখানে একটি উপায় সহজ সমাধান যা ইউআইটিেক্সটফিল্ডের স্থানধারীর মতো হুবহু আচরণ করে তবে কাস্টম ভিউ আঁকার দরকার নেই বা প্রথম প্রতিক্রিয়াকারীকে পদত্যাগ করা প্রয়োজন।

- (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;
    }

}

(অন্যথায় দ্বিতীয় চেক যদি বিবৃতিটি সেই ক্ষেত্রে থাকে যেখানে কিছুই প্রবেশ করা হয় না এবং ব্যবহারকারী ব্যাকস্পেস টিপে থাকে)

কেবলমাত্র আপনার ক্লাসটিকে একটি ইউআইটিএক্সেক্সটভিউ ডেলেগেট হিসাবে সেট করুন। ViewDidLoad এ আপনার পছন্দ করা উচিত

- (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
কথাটি হ'ল ব্যবহারকারী যদি "স্থানধারক পাঠ্য" কেরেটের মাঝখানে কোথাও ট্যাপ করেন।
অ্যালেক্স সোরোকোলেটোভ

10

হাই আপনি আইকিকিবোর্ড ম্যানেজারে উপলব্ধ আইকিউ টেক্সটভিউটি ব্যবহার করতে পারেন এটি আপনার পাঠ্যদর্শনের সুনির্দিষ্ট শ্রেণি আইকিউেক্সটভিউতে ব্যবহার এবং সংহত করার পক্ষে সহজ এবং আপনি যে রঙটি চান তার সাথে স্থানধারক লেবেল সেট করার জন্য এর সম্পত্তিটি ব্যবহার করতে পারেন। আপনি আইকিউকিবোর্ডম্যানেজার থেকে লাইব্রেরিটি ডাউনলোড করতে পারেন

অথবা আপনি এটি কোকোপড থেকে ইনস্টল করতে পারেন।


আইকিউ কীবোর্ডম্যানেজারটি খুব দরকারী এবং কোডহীন। আমার জন্য সেরা উত্তর!
এনএসডেভোপার

1
আসলে আমি upvote এবং কারণ জন্য মন্তব্য ছেড়ে। আমি জানি না আইকিউেক্সটভিউ আইকিকিবোর্ডম্যানেজারের আগে উপলব্ধ।
এনএসডেভোপার

আমার প্রতিনিধিটির সাথে সমস্যা ছিল। আমি ক্লাস থেকে প্রতিনিধি ওভাররাইড মুছে ফেলেছি এবং UITextViewDelegateঠিক সূক্ষ্ম কাজ
TheoK

নিম্নমানের উত্তর
গ্রান্টেসপো

10

অন্য উত্তর যুক্ত করার জন্য দুঃখিত, তবে আমি সবেমাত্র এ জাতীয় কিছু টেনে এনেছি এবং এটি ইউটিআইএক্সেক্সট ফিল্ডের নিকটতম স্থানধারক তৈরি করেছে।

আশা করি এটি কাউকে সাহায্য করবে।

-(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
বিবৃতিতে আমাকে প্রথমে কমান্ডগুলির ক্রম পরিবর্তন করতে হবে if(textView.textColor == [UIColor lightGrayColor]){ textView.textColor = [UIColor blackColor]; textView.text = [textView.text substringToIndex: 1]; অন্যথায় পাঠ্যদর্শনটিতে প্রবেশ করা প্রথম অক্ষরটি পাঠ্যের শেষে স্থাপন করা হয়েছিল
ফ্লেক্সিকোডার

7

কোডের কিছু লাইনের মধ্যে এটি ব্যবহারের সহজ উপায়:

এই লেবেলটিকে আপনার কোডের সাথে সংযুক্ত করে .nib এ UITextView পর্যন্ত একটি লেবেল নিন।

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{

    if (range.location>0 || text.length!=0) {
        placeholderLabel1.hidden = YES;
    }else{
        placeholderLabel1.hidden = NO;
    }
    return YES;
}

7

আমি আইওএস 7 এর সাথে কাজ করতে স্যাম সোফেসের বাস্তবায়নটি পরিবর্তন করেছি:

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];

    if (_shouldDrawPlaceholder)
    {
        UIEdgeInsets insets = self.textContainerInset;        
        CGRect placeholderRect = CGRectMake(
                insets.left + self.textContainer.lineFragmentPadding,
                insets.top,
                self.frame.size.width - insets.left - insets.right,
                self.frame.size.height - insets.top - insets.bottom);

        [_placeholderText drawWithRect:placeholderRect
                           options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine
                        attributes:self.placeholderAttributes
                           context:nil];
    }
}

- (NSDictionary *)placeholderAttributes
{
    if (_placeholderAttributes == nil)
    {
        _placeholderAttributes = @
        {
            NSFontAttributeName : self.font,
            NSForegroundColorAttributeName : self.placeholderColor
        };
    }

    return _placeholderAttributes;
}

_placeholderAttribues = nilফন্ট এবং তাদের প্রভাবিত করতে পারে এমন অন্যান্য থামগুলি পরিবর্তন করতে পারে এমন পদ্ধতিতে সেট করতে মনে রাখবেন । আপনি যদি এটি ত্রুটিযুক্ত না হন তবে অ্যাট্রিবিউটস ডিকশনারিটি তৈরি করতে "অলস" বর্জন করতেও পারেন।

সম্পাদনা করুন:

আপনি যদি প্লেসোল্ডারটিকে অটোলেআউট অ্যানিমেশন এবং এর মতো দেখতে ভাল দেখতে পছন্দ করেন তবে সেটবাউন্ডসের ওভাররাইড সংস্করণে সেটনিডসডপ্লে কল করতে ভুলবেন না।


আমি মনে করি আপনার অফসেট এক্স প্যারামিটারে insets.left যুক্ত করা উচিত।
কর্মে

এটি সেটবাউন্ডসের পরিবর্তে সেটফ্রেম নয়?
JakubKnejzlik

নাঃ! লেআউট অ্যানিমেশনের সময় সেটফ্রেমকে কল করা হয় না।
নাইলার

6

আপনি ইউআইটিেক্সটভিউয়ের সাবক্লাস হিসাবে একটি নতুন শ্রেণীর পাঠ্য ভিউউথপ্লেসহোল্ডার তৈরি করতে পারেন।

(এই কোডটি এক ধরণের রুক্ষ - তবে আমি মনে করি এটি সঠিক পথে রয়েছে))

@interface TextViewWithPlaceholder : UITextView
{

    NSString *placeholderText;  // make a property
    UIColor *placeholderColor;  // make a property
    UIColor *normalTextColor;   // cache text color here whenever you switch to the placeholderColor
}

- (void) setTextColor: (UIColor*) color
{
   normalTextColor = color;
   [super setTextColor: color];
}

- (void) updateForTextChange
{
    if ([self.text length] == 0)
    { 
        normalTextColor = self.textColor;
        self.textColor = placeholderColor;
        self.text = placeholderText;
    }
    else
    {
        self.textColor = normalTextColor;
    }

}

আপনার প্রতিনিধিটিতে এটি যুক্ত করুন:

- (void)textViewDidChange:(UITextView *)textView
{
    if ([textView respondsToSelector: @selector(updateForTextChange)])
    {
        [textView updateForTextChange];
    }

}

1
সঠিক আচরণটি পেতে আপনার নিজের স্থানধারককে অঙ্কন করে অঙ্কন করুন: (প্লেসোল্ডার কেবল তখনই আঁকুন! [স্বতঃপরিচয় রচনা করুন] && [[স্বতঃ পাঠ্য দৈর্ঘ্য] == 0)) এবং সেটনিডডিসপ্লে কল করুন ফার্স্ট রেসপন্ডার এবং পদত্যাগ করুন
ফার্স্ট

6

আমি 'ইউআইটিেক্সটভিউ' এর সাবক্লাসের নিজস্ব সংস্করণ তৈরি করেছি। আমি স্যাম সোফেসকে পছন্দ করেছি বিজ্ঞপ্তিগুলি ব্যবহারের ধারণাটি , তবে আমি আঁকার রেকট: ওভাররাইটটি পছন্দ করি নি। আমার কাছে ওভারকিল লাগছে। আমি মনে করি আমি খুব পরিষ্কার বাস্তবায়ন করেছি।

আপনি আমার সাবক্লাসটি এখানে দেখতে পারেন । একটি ডেমো প্রকল্পও অন্তর্ভুক্ত রয়েছে।


6

এই থ্রেডের প্রচুর উত্তর রয়েছে, তবে আমি পছন্দ করি এমন সংস্করণটি এখানে।

এটি বিদ্যমান শ্রেণিটিকে প্রসারিত করে UITextViewতাই সহজেই পুনঃব্যবহারযোগ্য এবং এটি ইভেন্টগুলিকে বাধা দেয় নাtextViewDidChange (যা ব্যবহারকারীর কোড ভঙ্গ করতে পারে, যদি তারা ইতিমধ্যে অন্য কোথাও এই ইভেন্টগুলিকে বাধা দিচ্ছিল)।

আমার কোড ব্যবহার করে (নীচে দেখানো হয়েছে), আপনি সহজেই আপনার যেকোন একটিতে স্থানধারক যুক্ত করতে পারেন UITextViews:

self.textViewComments.placeholder = @"(Enter some comments here.)";

আপনি যখন এই নতুন স্থানধারক মানটি সেট করেন, এটি নিঃশব্দে UILabelআপনার উপরে একটি জুড়ায় UITextView, তারপরে এটি লুকান / প্রয়োজনীয় হিসাবে দেখায়:

এখানে চিত্র বর্ণনা লিখুন

ঠিক আছে, এই পরিবর্তনগুলি করতে, এই কোডটি সম্বলিত একটি "UITextViewHelper.h" ফাইল যুক্ত করুন:

//  UITextViewHelper.h
//  Created by Michael Gledhill on 13/02/15.

#import <Foundation/Foundation.h>

@interface UITextView (UITextViewHelper)

@property (nonatomic, strong) NSString* placeholder;
@property (nonatomic, strong) UILabel* placeholderLabel;
@property (nonatomic, strong) NSString* textValue;

-(void)checkIfNeedToDisplayPlaceholder;

@end

... এবং এটি রয়েছে এমন একটি ইউআইটিেক্সটভিউহেল্পার.এম ফাইল:

//  UITextViewHelper.m
//  Created by Michael Gledhill on 13/02/15.
//
//  This UITextView category allows us to easily display a PlaceHolder string in our UITextView.
//  The downside is that, your code needs to set the "textValue" rather than the "text" value to safely set the UITextView's text.
//
#import "UITextViewHelper.h"
#import <objc/runtime.h>

@implementation UITextView (UITextViewHelper)

#define UI_PLACEHOLDER_TEXT_COLOR [UIColor colorWithRed:170.0/255.0 green:170.0/255.0 blue:170.0/255.0 alpha:1.0]

@dynamic placeholder;
@dynamic placeholderLabel;
@dynamic textValue;

-(void)setTextValue:(NSString *)textValue
{
    //  Change the text of our UITextView, and check whether we need to display the placeholder.
    self.text = textValue;
    [self checkIfNeedToDisplayPlaceholder];
}
-(NSString*)textValue
{
    return self.text;
}

-(void)checkIfNeedToDisplayPlaceholder
{
    //  If our UITextView is empty, display our Placeholder label (if we have one)
    if (self.placeholderLabel == nil)
        return;

    self.placeholderLabel.hidden = (![self.text isEqualToString:@""]);
}

-(void)onTap
{
    //  When the user taps in our UITextView, we'll see if we need to remove the placeholder text.
    [self checkIfNeedToDisplayPlaceholder];

    //  Make the onscreen keyboard appear.
    [self becomeFirstResponder];
}

-(void)keyPressed:(NSNotification*)notification
{
    //  The user has just typed a character in our UITextView (or pressed the delete key).
    //  Do we need to display our Placeholder label ?
   [self checkIfNeedToDisplayPlaceholder];
}

#pragma mark - Add a "placeHolder" string to the UITextView class

NSString const *kKeyPlaceHolder = @"kKeyPlaceHolder";
-(void)setPlaceholder:(NSString *)_placeholder
{
    //  Sets our "placeholder" text string, creates a new UILabel to contain it, and modifies our UITextView to cope with
    //  showing/hiding the UILabel when needed.
    objc_setAssociatedObject(self, &kKeyPlaceHolder, (id)_placeholder, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    self.placeholderLabel = [[UILabel alloc] initWithFrame:self.frame];
    self.placeholderLabel.numberOfLines = 1;
    self.placeholderLabel.text = _placeholder;
    self.placeholderLabel.textColor = UI_PLACEHOLDER_TEXT_COLOR;
    self.placeholderLabel.backgroundColor = [UIColor clearColor];
    self.placeholderLabel.userInteractionEnabled = true;
    self.placeholderLabel.font = self.font;
    [self addSubview:self.placeholderLabel];

    [self.placeholderLabel sizeToFit];

    //  Whenever the user taps within the UITextView, we'll give the textview the focus, and hide the placeholder if necessary.
    [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTap)]];

    //  Whenever the user types something in the UITextView, we'll see if we need to hide/show the placeholder label.
    [[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(keyPressed:) name:UITextViewTextDidChangeNotification object:nil];

    [self checkIfNeedToDisplayPlaceholder];
}
-(NSString*)placeholder
{
    //  Returns our "placeholder" text string
    return objc_getAssociatedObject(self, &kKeyPlaceHolder);
}

#pragma mark - Add a "UILabel" to this UITextView class

NSString const *kKeyLabel = @"kKeyLabel";
-(void)setPlaceholderLabel:(UILabel *)placeholderLabel
{
    //  Stores our new UILabel (which contains our placeholder string)
    objc_setAssociatedObject(self, &kKeyLabel, (id)placeholderLabel, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    [[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(keyPressed:) name:UITextViewTextDidChangeNotification object:nil];

    [self checkIfNeedToDisplayPlaceholder];
}
-(UILabel*)placeholderLabel
{
    //  Returns our new UILabel
    return objc_getAssociatedObject(self, &kKeyLabel);
}
@end

হ্যাঁ, এটি প্রচুর কোড, তবে একবার আপনি এটি আপনার প্রকল্পে যুক্ত করে এবং .h ফাইলটি অন্তর্ভুক্ত করেছেন ...

#import "UITextViewHelper.h"

... আপনি সহজেই স্থানধারকগুলি এতে ব্যবহার করতে পারেন UITextViews

যদিও একটি আছে।

আপনি যদি এটি করেন:

self.textViewComments.placeholder = @"(Enter some comments here.)";
self.textViewComments.text = @"Ooooh, hello there";

... স্থানধারক পাঠ্যের শীর্ষে উপস্থিত হবে । আপনি যখন textমানটি সেট করেন , নিয়মিত বিজ্ঞপ্তিগুলির কোনওটিই কল হয় না, সুতরাং স্থানধারকটি দেখানো / আড়াল করতে হবে কিনা তা স্থির করার জন্য আমি কীভাবে আমার ফাংশনটিতে কল করব তা কার্যকর করতে পারলাম না।

সমাধানটি textValueবরং সেট করা হয় text:

self.textViewComments.placeholder = @"(Enter some comments here.)";
self.textViewComments.textValue = @"Ooooh, hello there";

বিকল্পভাবে, আপনি textমান সেট করতে পারেন , তারপরে কল করতে পারেন checkIfNeedToDisplayPlaceholder

self.textViewComments.text = @"Ooooh, hello there";
[self.textViewComments checkIfNeedToDisplayPlaceholder];

আমি এর মতো সমাধানগুলি পছন্দ করি, কারণ তারা অ্যাপল আমাদের সরবরাহ করে এবং আমাদের (বিকাশকারী হিসাবে) আসলে যা প্রয়োজন তার মধ্যে "ফাঁক পূরণ" করে এবং আমাদের অ্যাপ্লিকেশনগুলিতে আমাদের মধ্যে করে। আপনি এই কোডটি একবার লিখুন, এটি আপনার "সহায়ক" .m / .h ফাইলগুলির লাইব্রেরিতে যুক্ত করুন এবং সময়ের সাথে সাথে, এসডিকে আসলে হতাশ হয়ে উঠতে শুরু করে।

(আমি আমার ইউআইটিেক্সটভিউজে "পরিষ্কার" বোতাম যুক্ত করার জন্য অনুরূপ সহায়ককে লিখেছি, অন্য জিনিস যা বিরক্তিকরভাবে রয়েছে UITextFieldতবে এতে নেই UITextView...)


আমি এটি কতটা পরিষ্কার তা পছন্দ করি তবে এটি অপছন্দ করি কীভাবে এটির জন্য দ্বিতীয় ইউআইভিউ / ইউআইএলবেল প্রয়োজন (এবং ইউআইটিেক্সটভিউ থেকে সহজেই বৈশিষ্ট্যগুলি / রঙ / ফন্টটি উত্তরাধিকারী হয় না)। যদিও দুর্দান্ত অবদান
mattsven

6

প্রথমে .h ফাইলটিতে একটি লেবেল নিন।

এই আমি নিই

UILabel * lbl;

তারপরে ভিডির অধীনে .m এ এটি ঘোষণা করুন L

lbl = [[UILabel alloc] initWithFrame:CGRectMake(8.0, 0.0,250, 34.0)];

lbl.font=[UIFont systemFontOfSize:14.0];

[lbl setText:@"Write a message..."];

[lbl setBackgroundColor:[UIColor clearColor]];

[lbl setTextColor:[UIColor lightGrayColor]];

[textview addSubview:lbl];

পাঠ্যদর্শনটি আমার পাঠ্যদর্শন।

এখন ঘোষণা করুন

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

 if (![textView hasText]){

    lbl.hidden = NO;

 }
 else{
    lbl.hidden = YES;
 }

}

এবং আপনার পাঠ্যদর্শন স্থানধারক প্রস্তুত!


6

আমি 'ইউআইটিেক্সটভিউ + প্লেসহোল্ডার' পড ব্যবহার করার পরামর্শ দিচ্ছি

pod 'UITextView+Placeholder'

আপনার কোডে

#import "UITextView+Placeholder.h"

////    

UITextView *textView = [[UITextView alloc] init];
textView.placeholder = @"How are you?";
textView.placeholderColor = [UIColor lightGrayColor];

5
    - (void)textViewDidChange:(UITextView *)textView
{
    placeholderLabel.hidden = YES;
}

পাঠ্যদর্শনটির উপরে একটি লেবেল রাখুন।


বা এর চেয়েও ভাল আপনি কোনও পাঠ্য উপস্থিত না থাকলে এটি আবার দেখাতে পারেন: lblPlaceholder.hmitted =! [পাঠ্য ভিউ.টেক্সটটি একুয়ালটো স্ট্রিং: @ ""];
দেশপোটোভিচ

আমি এই পরিষ্কার সমাধানটি পছন্দ করি, পাঠ্যদর্শন নিজেই কোনও ইঞ্জেকশন নেই।
ইটাছি

5

ইউআইটিেক্সটভিউতে প্লেসোল্ডার তৈরি করা সম্ভব নয় তবে আপনি এটির মাধ্যমে স্থানধারীর মতো প্রভাব তৈরি করতে পারেন।

  - (void)viewDidLoad{      
              commentTxtView.text = @"Comment";
              commentTxtView.textColor = [UIColor lightGrayColor];
              commentTxtView.delegate = self;

     }
       - (BOOL) textViewShouldBeginEditing:(UITextView *)textView
     {
         commentTxtView.text = @"";
         commentTxtView.textColor = [UIColor blackColor];
         return YES;
     }

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

    if(commentTxtView.text.length == 0){
        commentTxtView.textColor = [UIColor lightGrayColor];
        commentTxtView.text = @"Comment";
        [commentTxtView resignFirstResponder];
    }
    }

অথবা আপনি ঠিক যেমন পাঠ্যদর্শনটিতে লেবেল যুক্ত করতে পারেন

       lbl = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 0.0,textView.frame.size.width - 10.0, 34.0)];


[lbl setText:kDescriptionPlaceholder];
[lbl setBackgroundColor:[UIColor clearColor]];
[lbl setTextColor:[UIColor lightGrayColor]];
textView.delegate = self;

[textView addSubview:lbl];

এবং সেট

- (void)textViewDidEndEditing:(UITextView *)theTextView
{
     if (![textView hasText]) {
     lbl.hidden = NO;
}
}

- (void) textViewDidChange:(UITextView *)textView
{
    if(![textView hasText]) {
      lbl.hidden = NO;
}
else{
    lbl.hidden = YES;
 }  
}

5

এই ইউআইটিেক্সটফিল্ডের স্থানধারককে পুরোপুরি অনুকরণ করে, যেখানে আপনি আসলে কিছু টাইপ না করা পর্যন্ত স্থান ধারক পাঠ্য স্থির থাকে।

private let placeholder = "Type here"

@IBOutlet weak var textView: UITextView! {
    didSet {
        textView.textColor = UIColor.lightGray
        textView.text = placeholder
        textView.selectedRange = NSRange(location: 0, length: 0)
    }
}

extension ViewController: UITextViewDelegate {

    func textViewDidChangeSelection(_ textView: UITextView) {
        // Move cursor to beginning on first tap
        if textView.text == placeholder {
            textView.selectedRange = NSRange(location: 0, length: 0)
        }
    }

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if textView.text == placeholder && !text.isEmpty {
            textView.text = nil
            textView.textColor = UIColor.black
            textView.selectedRange = NSRange(location: 0, length: 0)
        }
        return true
    }

    func textViewDidChange(_ textView: UITextView) {
        if textView.text.isEmpty {
            textView.textColor = UIColor.lightGray
            textView.text = placeholder
        }
    }
}

4

এটি করার আরও একটি উপায় এখানে, UITextFieldএর স্থানধারকের সামান্য ইনডেন্টেশনটি পুনরুত্পাদন করে :

UITextFieldডানদিকে নীচে টানুন UITextViewযাতে উপরের বাম কোণগুলি সারিবদ্ধ হয়। পাঠ্যের ক্ষেত্রে আপনার স্থানধারক পাঠ্য যুক্ত করুন।

ভিউডিডলডে, যুক্ত করুন:

[tView setDelegate:self];
tView.contentInset = UIEdgeInsetsMake(-8,-8,0,0);
tView.backgroundColor = [UIColor clearColor];

তারপর যোগ:

- (void)textViewDidChange:(UITextView *)textView {
    if (textView.text.length == 0) {
        textView.backgroundColor = [UIColor clearColor];            
    } else {
        textView.backgroundColor = [UIColor whiteColor];
    }
}

4

এটি সহজ করে তোলে

একটি ইউআইএলবেল তৈরি করুন এবং এটি আপনার পাঠ্য দৃশ্যে রাখুন (পাঠ্যধারক-সেট রঙ ধূসর হিসাবে পাঠ্যটি দিন - আপনি আপনার xib এ সব করতে পারেন) এখন আপনার শিরোনামে ফাইলটি ইউআইএলবেল এবং টেক্সটভিউ ডেলেগেটের ঘোষণা দেয় এখন আপনি কেবল লেবেলটি আড়াল করতে পারবেন আপনি যখন পাঠ্যদর্শনটিতে ক্লিক করেন

নীচে সম্পূর্ণ কোড

হেডার

@interface ViewController :UIViewController<UITextViewDelegate>{
 }
   @property (nonatomic,strong) IBOutlet UILabel *PlceHolder_label;
   @property (nonatomic,strong) IBOutlet UITextView *TextView;

@end

বাস্তবায়ন

@implementation UploadFoodImageViewController
@synthesize PlceHolder_label,TextView;

  - (void)viewDidLoad
    {
       [super viewDidLoad];
    }


 - (BOOL)textViewShouldBeginEditing:(UITextView *)textView{

       if([textView isEqual:TextView]){
            [PlceHolder_label setHidden:YES];
            [self.tabScrlVw setContentOffset:CGPointMake(0,150) animated:YES];
          }
      return YES;
    }

@শেষ

Xib থেকে ফাইলওয়ালার সাথে টেক্সটভিউ এবং ইউআইএলবেল সংযোগ করতে ভুলবেন না


4

ইউটিপিলেসোল্ডার টেক্সটভিউতে একবার দেখুন ।

এটি ইউআইটিেক্সটভিউয়ের একটি সুবিধাজনক সাবক্লাস যা ইউআইটিেক্সটফিল্ডের সাথে পরিচিত প্লেসোল্ডারকে সমর্থন করে। প্রধান বিশেষত্ব:

  • সাবভিউ ব্যবহার করে না
  • ড্রয়ারকে ওভাররাইড করে না:
  • স্থানধারক নির্বিচারে দৈর্ঘ্যের হতে পারে এবং সাধারণ পাঠ্যের মতো ঠিক একইভাবে উপস্থাপিত হতে পারে

4

আমি এই সমস্তগুলির মধ্যে পড়েছি, তবে একটি খুব সংক্ষিপ্ত, সুইফট 3, সমাধান নিয়ে এসেছি যা আমার সমস্ত পরীক্ষায় কাজ করেছে। এটি কিছুটা সাধারণত্ব দাঁড়াতে পারে তবে প্রক্রিয়াটি সহজ। আমি "টেক্সটভিউউইথপ্লেসহোল্ডার" বলি এমন পুরো জিনিসটি এখানে।

import UIKit

class TextViewWithPlaceholder: UITextView {

    public var placeholder: String?
    public var placeholderColor = UIColor.lightGray

    private var placeholderLabel: UILabel?

    // Set up notification listener when created from a XIB or storyboard.
    // You can also set up init() functions if you plan on creating
    // these programmatically.
    override func awakeFromNib() {
        super.awakeFromNib()

        NotificationCenter.default.addObserver(self,
                                           selector: #selector(TextViewWithPlaceholder.textDidChangeHandler(notification:)),
                                           name: .UITextViewTextDidChange,
                                           object: self)

        placeholderLabel = UILabel()
        placeholderLabel?.alpha = 0.85
        placeholderLabel?.textColor = placeholderColor
    }

    // By using layoutSubviews, you can size and position the placeholder
    // more accurately. I chose to hard-code the size of the placeholder
    // but you can combine this with other techniques shown in previous replies.
    override func layoutSubviews() {
        super.layoutSubviews()

        placeholderLabel?.textColor = placeholderColor
        placeholderLabel?.text = placeholder

        placeholderLabel?.frame = CGRect(x: 6, y: 4, width: self.bounds.size.width-16, height: 24)

        if text.isEmpty {
            addSubview(placeholderLabel!)
            bringSubview(toFront: placeholderLabel!)
        } else {
            placeholderLabel?.removeFromSuperview()
        }
    }

    // Whenever the text changes, just trigger a new layout pass.
    func textDidChangeHandler(notification: Notification) {
        layoutSubviews()
    }
}

কিছু উদ্বেগ এখানে। আপনার layoutSubviews()সরাসরি কল করা উচিত নয় । এবং আপনি নোটিফিকেশনকেন্দ্র পর্যবেক্ষককে সরান নি।
হ্লুং

4

আমি দ্রুত একটি ক্লাস লিখেছি। আপনি যখনই প্রয়োজন এই ক্লাসটি আমদানি করতে পারেন।

import UIKit

পাবলিক ক্লাস কাস্টম টেক্সটভিউ: ইউআইটিেক্সটভিউ {

private struct Constants {
    static let defaultiOSPlaceholderColor = UIColor(red: 0.0, green: 0.0, blue: 0.0980392, alpha: 0.22)
}
private let placeholderLabel: UILabel = UILabel()

private var placeholderLabelConstraints = [NSLayoutConstraint]()

@IBInspectable public var placeholder: String = "" {
    didSet {
        placeholderLabel.text = placeholder
    }
}

@IBInspectable public var placeholderColor: UIColor = CustomTextView.Constants.defaultiOSPlaceholderColor {
    didSet {
        placeholderLabel.textColor = placeholderColor
    }
}

override public var font: UIFont! {
    didSet {
        placeholderLabel.font = font
    }
}

override public var textAlignment: NSTextAlignment {
    didSet {
        placeholderLabel.textAlignment = textAlignment
    }
}

override public var text: String! {
    didSet {
        textDidChange()
    }
}

override public var attributedText: NSAttributedString! {
    didSet {
        textDidChange()
    }
}

override public var textContainerInset: UIEdgeInsets {
    didSet {
        updateConstraintsForPlaceholderLabel()
    }
}

override public init(frame: CGRect, textContainer: NSTextContainer?) {
    super.init(frame: frame, textContainer: textContainer)
    commonInit()
}

required public init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    commonInit()
}

private func commonInit() {
    NSNotificationCenter.defaultCenter().addObserver(self,
                                                     selector: #selector(textDidChange),
                                                     name: UITextViewTextDidChangeNotification,
                                                     object: nil)

    placeholderLabel.font = font
    placeholderLabel.textColor = placeholderColor
    placeholderLabel.textAlignment = textAlignment
    placeholderLabel.text = placeholder
    placeholderLabel.numberOfLines = 0
    placeholderLabel.backgroundColor = UIColor.clearColor()
    placeholderLabel.translatesAutoresizingMaskIntoConstraints = false
    addSubview(placeholderLabel)
    updateConstraintsForPlaceholderLabel()
}

private func updateConstraintsForPlaceholderLabel() {
    var newConstraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|-(\(textContainerInset.left + textContainer.lineFragmentPadding))-[placeholder]",
                                                                        options: [],
                                                                        metrics: nil,
                                                                        views: ["placeholder": placeholderLabel])
    newConstraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|-(\(textContainerInset.top))-[placeholder]",
                                                                     options: [],
                                                                     metrics: nil,
                                                                     views: ["placeholder": placeholderLabel])
    newConstraints.append(NSLayoutConstraint(
        item: placeholderLabel,
        attribute: .Width,
        relatedBy: .Equal,
        toItem: self,
        attribute: .Width,
        multiplier: 1.0,
        constant: -(textContainerInset.left + textContainerInset.right + textContainer.lineFragmentPadding * 2.0)
        ))
    removeConstraints(placeholderLabelConstraints)
    addConstraints(newConstraints)
    placeholderLabelConstraints = newConstraints
}

@objc private func textDidChange() {
    placeholderLabel.hidden = !text.isEmpty
}

public override func layoutSubviews() {
    super.layoutSubviews()
    placeholderLabel.preferredMaxLayoutWidth = textContainer.size.width - textContainer.lineFragmentPadding * 2.0
}

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self,
                                                        name: UITextViewTextDidChangeNotification,
                                                        object: nil)
}

}

এখানে চিত্র বর্ণনা লিখুন


1
এটি আসলে আমি খুঁজে পেতে সক্ষম হয়েছি এমন একটি পরিষ্কার সমাধান এবং আমি এটি ব্যবহার করে শেষ করেছিলাম .. বিশেষত পোকামাকড়কে বিবেচনায় নেওয়া এবং লেবেলের জন্য সীমাবদ্ধতাগুলি ব্যবহার করা একটি দুর্দান্ত স্পর্শ, আমি অনেকগুলি (কোনও?) সমাধান গ্রহণ করতে দেখিনি have সীমা, ফন্ট, আরটিএল ইত্যাদি পরিবর্তনের যত্ন
চিহ্নিত করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.