এই থ্রেডের প্রচুর উত্তর রয়েছে, তবে আমি পছন্দ করি এমন সংস্করণটি এখানে।
এটি বিদ্যমান শ্রেণিটিকে প্রসারিত করে 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
...)