UITextView
এর কপি, কাটা, নির্বাচন করুন, সকল নির্বাচন কার্যকারিতা ডিফল্ট যখন আমি পর্দায় ঠাসা প্রদর্শন করা হয়। তবে, আমার প্রকল্পে UITextField
কেবলমাত্র পঠনযোগ্য। আমার এই কার্যকারিতাটির প্রয়োজন নেই। কীভাবে এই বৈশিষ্ট্যটি অক্ষম করবেন আমাকে বলুন।
UITextView
এর কপি, কাটা, নির্বাচন করুন, সকল নির্বাচন কার্যকারিতা ডিফল্ট যখন আমি পর্দায় ঠাসা প্রদর্শন করা হয়। তবে, আমার প্রকল্পে UITextField
কেবলমাত্র পঠনযোগ্য। আমার এই কার্যকারিতাটির প্রয়োজন নেই। কীভাবে এই বৈশিষ্ট্যটি অক্ষম করবেন আমাকে বলুন।
উত্তর:
পেস্টবোর্ড ক্রিয়াকলাপ অক্ষম করার সহজতম উপায় হ'ল এমন একটি সাবক্লাস তৈরি করা যা আপনি মঞ্জুরি দিতে চান না এমন ক্রিয়াগুলির জন্য ফিরে আসার পদ্ধতিটিকে UITextView
ওভাররাইড করে :canPerformAction:withSender:
NO
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(paste:))
return NO;
return [super canPerformAction:action withSender:sender];
}
আরো দেখুন UIResponder
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { return NO; }
- সমস্ত বিকল্প অবরুদ্ধ করতে
সাবক্লাস ইউআইটিেক্সটভিউ দেখুন এবং ওভাররাইট ক্যানকেকমফার্সআস্ট রিসপন্ডার:
- (BOOL)canBecomeFirstResponder {
return NO;
}
দ্রষ্টব্য, এটি কেবল অ-সম্পাদনাযোগ্য UITextViews এর জন্য প্রযোজ্য! সম্পাদনাযোগ্যগুলিতে এটি পরীক্ষা করা হয়নি ...
return NO;
উপর - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
পদ্ধতি একটি ভাল বিকল্প।
আপনি যদি আপনার সমস্ত UITextView
অ্যাপ্লিকেশনটিতে কাট / অনুলিপি / পেস্ট অক্ষম করতে চান তবে আপনি এর সাথে একটি বিভাগ ব্যবহার করতে পারেন :
@implementation UITextView (DisableCopyPaste)
- (BOOL)canBecomeFirstResponder
{
return NO;
}
@end
এটি একটি সাবক্লাসিং সংরক্ষণ করে ... :-)
UITextView
হিসাবে কাজ করে এবং প্রত্যাশিত আচরণ করা থেকে বাধা দেয় যখন উদাহরণস্বরূপ, এটি সম্পাদনাযোগ্য এবং স্পর্শ পায়। এটি ওভাররাইড করার মতো অনেক কিছুই canPerformAction:withSender:
; প্রোটোকলটি এটাই।
এটি ছিল আমার পক্ষে সবচেয়ে কার্যকর সমাধান:
UIView *overlay = [[UIView alloc] init];
[overlay setFrame:CGRectMake(0, 0, myTextView.contentSize.width, myTextView.contentSize.height)];
[myTextView addSubview:overlay];
[overlay release];
@ আরপেটরিচ উত্তর আমার পক্ষে কাজ করেছে। কাউকে কিছুটা সময় সাশ্রয় করার ক্ষেত্রে আমি প্রসারিত কোডটি পোস্ট করছি।
আমার ক্ষেত্রে আমি যাই হোক না কেন কোনও পপআপ চাই না, তবে আমি চাই ইউআইটিেক্সটফিল্ডটি প্রথম প্রতিক্রিয়াশীল হতে সক্ষম হোক।
দুর্ভাগ্যক্রমে, আপনি টেক্সটফিল্ডটি আলতো চাপলে এবং ধরে রাখলে আপনি এখনও ম্যাগনিফায়ার পপআপ পাবেন।
@interface NoSelectTextField : UITextField
@end
@implementation NoSelectTextField
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (action == @selector(paste:) ||
action == @selector(cut:) ||
action == @selector(copy:) ||
action == @selector(select:) ||
action == @selector(selectAll:) ||
action == @selector(delete:) ||
action == @selector(makeTextWritingDirectionLeftToRight:) ||
action == @selector(makeTextWritingDirectionRightToLeft:) ||
action == @selector(toggleBoldface:) ||
action == @selector(toggleItalics:) ||
action == @selector(toggleUnderline:)
) {
return NO;
}
return [super canPerformAction:action withSender:sender];
}
@end
সুইফট 4
class NoSelectTextField: UITextField {
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if action == #selector(paste(_:)) ||
action == #selector(cut(_:)) ||
action == #selector(copy(_:)) ||
action == #selector(select(_:)) ||
action == #selector(selectAll(_:)) ||
action == #selector(delete(_:)) ||
action == #selector(makeTextWritingDirectionLeftToRight(_:)) ||
action == #selector(makeTextWritingDirectionRightToLeft(_:)) ||
action == #selector(toggleBoldface(_:)) ||
action == #selector(toggleItalics(_:)) ||
action == #selector(toggleUnderline(_:)) {
return false
}
return super.canPerformAction(action, withSender: sender)
}
}
যদি আপনার স্ক্রোল করার জন্য ইউআইটিএক্সেক্সটভিউয়ের প্রয়োজন না হয়, তবে সবচেয়ে সহজ সমাধান যা সাব-শ্রেণিবদ্ধকরণের সাথে জড়িত না কেবল তা হল পাঠ্য দর্শনের জন্য কেবল ব্যবহারকারী ইন্টারঅ্যাকশন অক্ষম করা:
textField.userInteractionEnabled = NO;
সবচেয়ে সহজ উপায় হ'ল ইউআইটিেক্সটভিউয়ের একটি সাবক্লাস তৈরি করা যা ক্যান পারফর্মঅ্যাকশনকে ওভাররাইড করে: সেন্ডার সহ:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
[UIMenuController sharedMenuController].menuVisible = NO; //do not display the menu
[self resignFirstResponder]; //do not allow the user to selected anything
return NO;
}
আমি যখন আইওএস 7-এ ক্যান পারফর্ম এ্যাকশনটিতে কোনও নম্বর ফিরিয়ে দেব না তখন আমি এরকম অনেক ত্রুটি পেয়ে যাব:
<Error>: CGContextSetFillColorWithColor: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update.
আমার সমাধানটি নিম্নলিখিত:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO];
}];
return [super canPerformAction:action withSender:sender];
}
কৌশলটি হ'ল মেনু নিয়ামকটিকে মূল সারিতে পরবর্তী চক্রটিতে (এটি প্রদর্শিত হওয়ার ঠিক পরে) লুকিয়ে রাখা।
কোনও ইউআইটিেক্সটভিউতে পুরো নির্বাচন / অনুলিপি / মেনু আটকানোর এটি সহজতম উপায়
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
[UIMenuController sharedMenuController].menuVisible = NO;
return NO;
}
আপনি যদি একটি সঙ্গে কীবোর্ড প্রতিস্থাপন করতে খুঁজছি হয়, এর কথা বলা যাক UIPicker
যেমন inputView
(একটি যেমন কোর্স টুলবার সঙ্গে inputAccesotyView
), তারপর এই কার্যসংক্রান্ত যথাসাধ্য সাহায্যের ...
textFieldShouldBeginEditing:
textField.userInteractionEnabled = NO;
UIPickerView
বন্ধটি বন্ধ করতে চলেছেন, এটিকে হ্যাঁ সেট করুন।এটি করার মাধ্যমে, আপনি টিপতে পারবেন UITextField
এবং বিকল্পগুলি বেছে নেওয়ার জন্য UIPickerView
এই মুহুর্তে আপনার UITextField
পছন্দসই, কোনও স্পর্শ ইভেন্টের প্রতিক্রিয়া জানাতে পারবেন না (এতে কাটা, অনুলিপি এবং পেস্টের জন্য স্পর্শ এবং হোল্ড রয়েছে)। যাইহোক, আপনি যখন এটি বন্ধ করে দিচ্ছেন UIPickerView
তবে আপনাকে এটি UIPickerView
পুনরায় অ্যাক্সেস করতে সক্ষম হবেন না তবে আপনাকে এটি আবার YES এ সেট করে রাখতে হবে ।
ব্যর্থ হওয়ার একমাত্র মুহুর্তটি যখন ব্যবহারকারী ট্যাপ করে ধরে রাখার মাধ্যমে শুরু করে UITextView
, তারপরে আপনি কাটা অনুলিপিটি দেখতে পাবেন এবং প্রথমবারের জন্য আবার পেস্ট করুন। এজন্য আপনার ইনপুটগুলি সর্বদা যাচাই করা উচিত। এটি আমি ভাবতে সবচেয়ে সহজ। অন্য বিকল্পটি ছিল UILabel
কেবলমাত্র পঠনযোগ্য পাঠ্যের জন্য একটি ব্যবহার করা কিন্তু আপনি এর থেকে দুর্দান্ত কার্যকারিতাটি মিস করেন UITextView
।
সাবক্লাস ইউআইটিেক্সটভিউ - সুইফট ৪.০
override public func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return false
}
আপনি যদি পপআপটি অক্ষম করতে চান UITextField
তবে এই UITextFieldDelegate
পদ্ধতিটি টগল করার চেষ্টা করুন isUserInteractionEnabled
।
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
textField.isUserInteractionEnabled = false
return true
}
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
textField.isUserInteractionEnabled = true
return true
}
আমি এখানে পাঠ্য নির্বাচন + ম্যাগনিফায়ার অক্ষম করার জন্য একটি কার্যকরী জবাব সরবরাহ করেছি , সক্ষম ক্লাইকেবল লিঙ্কগুলি আশা করি যা সহায়তা করে:
দীর্ঘ সময় চেষ্টার পরে, আমি কেবলমাত্র ইউআইএলএক্সপ্রেস ভিউ সাবক্লাসে অ্যাডগাস্টারআরগনাইজারকে ওভাররাইড করে পাঠ্য নির্বাচন, ম্যাগনিফায়ারিং এবং ডেটা সনাক্তকরণ (লিঙ্কগুলি ক্লিকযোগ্য ইত্যাদি) রোধ করতে পেরেছি কেবলমাত্র ইউআইএলংপ্রেসজেস্টার সনাক্তকারীকে বিলম্ব করতে স্পর্শ করতে:
UIUnselectableTextView.m
-(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
if([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]] && gestureRecognizer.delaysTouchesEnded)
{
[super addGestureRecognizer:gestureRecognizer];
}
}
জন্য সুইফট 3 এটি পরিবর্তন হয়েছে দেখুন:
override public func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return false
}
আমি এটা করেছি. আমার উপর UITextView
আমি খুব সহজেই কাটা, অনুলিপি, নির্বাচন ইত্যাদি বিকল্প অক্ষম করেছি।
আমি UIView
যেখানে রেখেছিলাম সেখানে একই স্থানে রেখেছি UITextView
, self.view
এবং নীচে একটি touchDelegate
পদ্ধতি যুক্ত করেছি :
(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *scrollTouch=[touches anyObject];
if(scrollTouch.view.tag==1)
{
NSLog(@"viewTouched");
if(scrollTouch.tapCount==1)
[textView1 becomeFirstResponder];
else if(scrollTouch.tapCount==2)
{
NSLog(@"double touch");
return;
}
}
}
এবং এটা আমার জন্য কাজ করে। ধন্যবাদ.
দ্রুতগতি
textView.selectable = false // disable text selection (and thus copy/paste/etc)
সম্পর্কিত
textView.editable = false // text cannot be changed but can still be selected and copied
textView.userInteractionEnabled = false // disables all interaction, including scrolling, clicking on links, etc.
আপনি যদি আপনার ইউআইটিেক্সটভিউতে একটি কাস্টম বিকল্প যুক্ত করতে চান তবে বিদ্যমান ফাংশনগুলি অক্ষম করতে চান তবে আপনি সুইফট 3 এ এটি করেন :
অনুলিপিটি অক্ষম করতে, পেস্ট করুন, ফানসিওনালিটি কেটে একটি সাবক্লাস তৈরি করুন এবং নিম্নলিখিতগুলি ওভাররাইড করুন:
override public func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return false
}
ভিউকন্ট্রোলারে আপনার কাস্টমটেক্সটভিউতে আপনার বিকল্পগুলি যুক্ত করতে নিম্নলিখিতগুলি যুক্ত করুন:
let selectText = UIMenuItem(title: "Select", action: #selector(ViewController.selected))
func selected() {
if let selectedRange = textView.selectedTextRange, let
selectedText = textView.text(in: selectedRange) {
}
print("User selected text: \(selectedText)")
}
এই পদ্ধতিটি নির্বাচন নির্বাচন করুন, সমস্ত নির্বাচন করুন, মেনু আটকান সম্পূর্ণভাবে অক্ষম করবে। যদি আপনি এখনও অন্য কিছু পদক্ষেপ পান তবে নীচের হিসাবে যদি কেবলমাত্র এটির সাথে যুক্ত করুন।
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender // This is to disable select / copy / select all / paste menu
{
if (action == @selector(copy:) || action == @selector(selectAll:) || action == @selector(select:) || action == @selector(paste:))
return NO;
return [super canPerformAction:action withSender:sender];
}
আপনি কেবল এই জাতীয় বিভাগ তৈরি করতে পারেন:
UITextView + + Selectable.h
@interface UITextView (Selectable)
@property (nonatomic, assign, getter = isTextSelectable) bool textSelectable;
@end
UITextView + + Selectable.m
#import "UITextView+Selectable.h"
#import <objc/runtime.h>
#define TEXT_SELECTABLE_PROPERTY_KEY @"textSelectablePropertyKey"
@implementation UITextView (Selectable)
@dynamic textSelectable;
-(void)setTextSelectable:(bool)textSelectable {
objc_setAssociatedObject(self, TEXT_SELECTABLE_PROPERTY_KEY, [NSNumber numberWithBool:textSelectable], OBJC_ASSOCIATION_ASSIGN);
}
-(bool)isTextSelectable {
return [objc_getAssociatedObject(self, TEXT_SELECTABLE_PROPERTY_KEY) boolValue];
}
-(bool)canBecomeFirstResponder {
return [self isTextSelectable];
}
@end
সাবক্লাসিং UITextView
এবং ওভাররাইডিং - (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
অযাচিত ক্রিয়াকলাপ অক্ষম করার আরেকটি সম্ভাবনা।
gestureRecognizer
ক্রিয়াটি যুক্ত করা উচিত কিনা তা নির্ধারণ করতে -অবজেক্টের শ্রেণিটি ব্যবহার করুন ।
(SWIFT) আপনি যদি মেনু অপশন বা ম্যাগনিফাইং গ্লাসের কোনওটিই না দিয়ে কেবল একটি বেসিক পাঠ্য ক্ষেত্র চান তবে ইউআইটিেক্সটফিল্ডের একটি সাবক্লাসটি ইঙ্গিতরর রেকগনিজারশোল্ডারবাগিনে মিথ্যা প্রত্যাবর্তন করুন:
class TextFieldBasic: UITextField {
override func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
return false
}
}
এটি পাঠ্য ক্ষেত্রে সমস্ত স্পর্শ কার্যকারিতা বাইপাস করবে কিন্তু তবুও অক্ষরগুলি যুক্ত করতে / অপসারণ করতে আপনাকে পপআপ কীবোর্ড ব্যবহার করার অনুমতি দেয়।
আপনি যদি স্টোরিবোর্ডটি ব্যবহার করছেন তবে সদ্য নির্মিত ক্লাসটি পাঠ্য ক্ষেত্রে নির্দিষ্ট করে দিন বা আপনি যদি পাঠ্য ক্ষেত্রটি অগ্রগতিমূলকভাবে তৈরি করছেন:
var basicTextField = TextFieldBasic()
basic = basicTextField(frame: CGRectMake(10, 100, 100,35))
basic.backgroundColor = UIColor.redColor()
self.view.addSubview(basic)
basic.becomeFirstResponder()
override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool
{
NSOperationQueue .mainQueue().addOperationWithBlock({ () -> Void in
[UIMenuController .sharedMenuController() .setMenuVisible(false, animated: true)]
})
return super.canPerformAction(action, withSender: sender)}
সুইফট 3
এটি করার জন্য, আপনাকে আপনার ইউআইটিেক্সটভিউ সাবক্লাস করতে হবে এবং এই পদ্ধতিটি রাখা উচিত।
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if (action == #selector(copy(_:))) {
return false
}
if (action == #selector(cut(_:))) {
return false
}
if (action == #selector(paste(_:))) {
return false
}
return super.canPerformAction(action, withSender: sender)
}
ইউআইটিেক্সটভিউতে দুটি সম্পত্তি রয়েছে যা আপনার যা প্রয়োজন তা করবে: isSelectable এবং isEdable ।
মিথ্যাতে isEditable সেট সম্পাদনা করতে ব্যবহারকারী টেক্সট এড়াতে হবে এবং সেটিং isSelectable মিথ্যাতে আপনি আপনার textView ভিতরে পাঠ্য নির্বাচন তাই এই কর্ম মেনু দেখানো হবে তা প্রতিরোধ করা হবে যদি ব্যবহারকারীরা এড়াতে হবে।
রেফারেন্সের জন্য নমুনা কোডটি সন্ধান করুন:
override public func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if action == #selector(copy(_:)) || action == #selector(paste(_:)) || action == #selector(UIResponderStandardEditActions.paste(_:)) ||
action == #selector(replace(_:withText:)) ||
action == #selector(UIResponderStandardEditActions.cut(_:)) ||
action == #selector(UIResponderStandardEditActions.select(_:)) ||
action == #selector(UIResponderStandardEditActions.selectAll(_:)) ||
action == #selector(UIResponderStandardEditActions.delete(_:)) ||
action == #selector(UIResponderStandardEditActions.makeTextWritingDirectionLeftToRight(_:)) ||
action == #selector(UIResponderStandardEditActions.makeTextWritingDirectionRightToLeft(_:)) ||
action == #selector(UIResponderStandardEditActions.toggleBoldface(_:)) ||
action == #selector(UIResponderStandardEditActions.toggleItalics(_:)) ||
action == #selector(UIResponderStandardEditActions.toggleUnderline(_:)) ||
action == #selector(UIResponderStandardEditActions.increaseSize(_:)) ||
action == #selector(UIResponderStandardEditActions.decreaseSize(_:))
{
return false
}
return true
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { retrun bool }
জায়গায় ব্যবহার করুন textFieldShouldBeginEditing
।
class ViewController: UIViewController , UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
//Show date picker
let datePicker = UIDatePicker()
datePicker.datePickerMode = UIDatePickerMode.date
textField.tag = 1
textField.inputView = datePicker
}
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if textField.tag == 1 {
textField.text = ""
return false
}
return true
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField.tag == 1 {
textField.text = ""
return false
}
return true
}
}
স্টপপস্টেকশন.সুইফ্ট নামে একটি নতুন ক্লাস তৈরি করুন
import UIKit
class StopPasteAction: UITextField {
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return false
}
}
আপনার বর্তমান পাঠ্যফিল্ড সহ নতুন শ্রেণীর ক্লাস যুক্ত করুন