UITextView में सभी कॉपी, कट, सिलेक्ट, सिलेक्ट कैसे करें


110

UITextViewकी कॉपी, कट, का चयन करें, सभी का चयन कार्यक्षमता डिफ़ॉल्ट जब मैं स्क्रीन पर नीचे प्रेस द्वारा दिखाया गया है। लेकिन, मेरी परियोजना में UITextFieldकेवल केवल पढ़ा जाता है। मुझे इस कार्यक्षमता की आवश्यकता नहीं है। कृपया मुझे बताएं कि इस सुविधा को कैसे अक्षम किया जाए।


3
जगह [UIMenuController ShareMenuController] .menuVouble = NO; - (BOOL) canPerformAction: (SEL) कार्रवाई withSender: (आईडी) प्रेषक विधि।
रावूरिनंदन

जवाबों:


108

पेस्टबोर्ड संचालन को अक्षम करने का सबसे आसान तरीका यह है UITextViewकि उस का एक उपवर्ग बनाएं जो उन कार्यों के canPerformAction:withSender:लिए लौटने की विधि को ओवरराइड करता है NOजिन्हें आप अनुमति नहीं देना चाहते हैं:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(paste:))
        return NO;
    return [super canPerformAction:action withSender:sender];
}

इसके अलावा UIResponder देखें


1
@rpetrichm, मैंने आपको समाधान का उपयोग किया, कॉपी / पेस्ट / कट / चयन / चयन करें सभी विकल्प अक्षम हैं लेकिन वहाँ आ रहा है बदलें ... | BIU | परिभाषित विकल्प मैं उस पूर्ण मेनू को अक्षम करना चाहता हूं।
अमीट धस

3
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { return NO; }- सभी विकल्पों को ब्लॉक करने के लिए
इस्लाम Q.

यह बहुत अच्छा है, हालाँकि मैं यह नहीं जानता कि यह UISearchBar के लिए कैसे किया जाए - क्योंकि मेरे अंदर एक पाठ क्षेत्र भी है, मुझे लगा कि मैं UISearchBar की उपवर्ग की विधि को अधिलेखित कर सकता हूं लेकिन यह दुर्भाग्य से काम नहीं करता है। इसके लिए कोई विचार?
बोरचेरो

मेरे पास कई नियंत्रण हैं। कैसे सिर्फ एक नियंत्रण पर कॉपी पेस्ट की अनुमति दें?
गौचो

यह UITextView के लिए काम नहीं कर रहा है, हालांकि मैंने SO पर कई स्थानों पर सुझाए गए इस समाधान को देखा है। क्या किसी को यह पता है कि यह कैसे करना है?
Pigpocket

67

उपवर्ग UITextView और ओवरराइट करें

- (BOOL)canBecomeFirstResponder {
    return NO;
}

ध्यान दें, यह केवल गैर-संपादन योग्य UITextViews के लिए लागू होता है! संपादन योग्य लोगों पर इसका परीक्षण नहीं किया गया है ...


मुझे लगता है कि return NO;पर - (BOOL)canPerformAction:(SEL)action withSender:(id)senderविधि एक बेहतर विकल्प है।
इस्लाम प्र।

29

यदि आप अपने सभी UITextView एप्लिकेशन पर कट / कॉपी / पेस्ट को निष्क्रिय करना चाहते हैं, तो आप एक श्रेणी का उपयोग कर सकते हैं :

@implementation UITextView (DisableCopyPaste)

- (BOOL)canBecomeFirstResponder
{
    return NO;
}

@end

यह एक उपवर्ग सहेजता है ... :-)


3
आप इसे केवल अपने /, फ़ाइल में रख सकते हैं, जहाँ आपको इस व्यवहार की आवश्यकता है।
markus_p

4
यह केवल एक साइड-इफ़ेक्ट के रूप में काम करता है और UITextViewजब अपेक्षा के अनुसार व्यवहार करने से रोकता है , उदाहरण के लिए, यह संपादन योग्य है और एक स्पर्श प्राप्त करता है। यह ओवरराइड करने के लिए बहुत कुछ है canPerformAction:withSender:; यही प्रोटोकॉल के लिए है।
jdc

16
आप किसी श्रेणी का उपयोग करके किसी विधि को सुरक्षित रूप से ओवरराइड नहीं कर सकते। यह अपरिभाषित व्यवहार है। किसी विधि को सुरक्षित रूप से ओवरराइड करने के लिए आपको उप-वर्ग करना होगा।
रोब नेपियर

2
नोट: यह आपके आवेदन में सभी UITextView पर लागू होगा। अधिकांश समय आदर्श नहीं।
17:22 बजे bbrame

2
यह भी ध्यान दें कि ऐप्पल इसके खिलाफ सलाह देता है : "यदि किसी श्रेणी में घोषित विधि का नाम मूल वर्ग में एक विधि के समान है, या उसी वर्ग (या यहां तक ​​कि एक सुपरक्लास) पर किसी अन्य श्रेणी में एक विधि है, तो व्यवहार है अपरिभाषित करने के लिए किस विधि के उपयोग को रनटाइम में उपयोग किया जाता है ... [] और] मानक कोकोआ या कोकोआ स्पर्श वर्गों में तरीकों को जोड़ने के लिए श्रेणियों का उपयोग करते समय समस्याएं पैदा कर सकती हैं। "
रोब

29

यह मेरे लिए सबसे अच्छा काम कर समाधान था:

UIView *overlay = [[UIView alloc] init];  
[overlay setFrame:CGRectMake(0, 0, myTextView.contentSize.width, myTextView.contentSize.height)];  
[myTextView addSubview:overlay];  
[overlay release];

से: https://stackoverflow.com/a/5704584/1293949


3
अच्छा है, यहाँ कोई उपवर्ग नहीं है!
मार्टिन रीचेल

7
मुझे यहां डक्ट-टेप और बेलिंग वायर अप्रोच बहुत पसंद है। काश मैं +1 आप फिर से कर सकते थे :) इसके बजाय, यहाँ एक सोने की स्टार है: i.imgur.com/EXLFt1Z.jpg
JDC

22

@rpetrich जवाब ने मेरे लिए काम किया। मैं विस्तारित कोड पोस्ट कर रहा हूं यदि यह किसी को कुछ समय बचाता है।

मेरे मामले में मैं कोई पॉपअप नहीं चाहता, लेकिन मैं चाहता हूं कि यूआईटेक्स्टफिल्ड पहले रेस्पोंडर बन सके।

दुर्भाग्य से, आप अभी भी आवर्धक पॉपअप प्राप्त करते हैं जब आप टेक्स्टफील्ड को टैप और होल्ड करते हैं।

@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)
    }

}

1
कृपया इस aswell के लिए एक स्विफ्ट संस्करण पोस्ट करें। धन्यवाद।
बजे सलमान खकवानी

@ पिनप: tnx अभी भी iOS 12.1.3 में पानी रखता है।
YvesLeBorg

20

यदि आपको स्क्रॉल करने के लिए UITextView की आवश्यकता नहीं है, तो सबसे सरल समाधान जिसमें सब-क्लासिंग शामिल नहीं है, बस पाठ दृश्य के लिए उपयोगकर्ता इंटरैक्शन को अक्षम करना है:

textField.userInteractionEnabled = NO;

2
यह लिंक आदि पर टैपिंग को हटा देता है, अगर ऐसा है तो टेक्स्टव्यू में है। ध्यान दिया जाना चाहिए कि यह चयन / कॉपी / पेस्ट को छुपाने के लिए एक अच्छा समाधान नहीं है, लेकिन बातचीत के कुछ स्तर को सक्षम भी रखता है।
बारफून

3
खैर, मैंने सोचा होगा कि यह स्पष्ट होगा।
ल्यूक रेडपाथ

मैं एक खेल में चित्रों के लिए पाठ फ़ील्ड का उपयोग कर रहा हूं और मैं नहीं चाहता कि आवर्धक ग्लास दिखाई दे और पाठ की प्रतिलिपि बनाने का कोई कारण नहीं है। यह मेरे लिए बहुत अच्छा काम करता है। मैं UIWebView में स्टाइल टेक्स्ट का उपयोग कर रहा हूं और वही लाइन वहां भी काम करती है।
जेस्केरी

15

सबसे आसान तरीका UITextView का उपवर्ग बनाना है जो canPerformAction को ओवरराइड करता है: withSender:

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

यह पाठ टाइप करने में सक्षम होने के लिए सबसे अच्छा समाधान है, लेकिन कुछ भी नहीं है, और पाठ-क्षेत्र पर टैप को अब 'अवरोधन' करने की अनुमति नहीं देता है। यह वही करता है जो ओपी चाहता था, और अधिक।
hlfcoding

13

जब मैं iOS 7 पर canPerformAction में NO लौटाऊंगा तो मुझे इस तरह की बहुत सारी त्रुटियाँ मिलेंगी:

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

चाल मेन क्यू पर अगले चक्र में मेनू नियंत्रक को छिपाने के लिए है (बस प्रदर्शित होने के बाद)।


बहुत अच्छे। एकमात्र समस्या यह है कि मेरे पास 2 टेक्स्टव्यू और एक टेक्स्टफिल्ड है और मैं केवल टेक्स्ट व्यू फ़ील्ड पर कॉपी-पेस्ट से बचना चाहता हूं। कैसे पहचानें जो canPerformAction कहा जाता है? प्रेषक चर UIMenuController है
Gaucho

1
यह UITextField (या UITextView) के उपवर्ग पर काम करता है। यदि आप अपने द्वारा किए गए उपवर्ग का उपयोग नहीं करते हैं, तो इसका कोई प्रभाव नहीं होगा। उदाहरण के लिए, मैंने एक TextFieldWithoutCopyPaste बनाया और इसका उपयोग किया, जहाँ मैं कॉपी पेस्ट कार्यक्षमता नहीं रखना चाहता था।
एडम वॉलनर

ठीक है, तुम सही हो। लेकिन मेरे मामले में, textView को canPerformAction का उपयोग करने के लिए सबक्लास की आवश्यकता होती है और कीबोर्ड दिखाए जाने पर विंडो को चेतन करने के लिए textFieldDidBeginEditing का उपयोग करने के लिए textField को उप-क्लास की आवश्यकता होती है। एनीमेशन कीबोर्ड के साथ विंडो को स्थानांतरित करता है। मैं इस पद्धति का उपयोग करने से बचने के लिए करता हूं कि कीबोर्ड टेक्स्टफिल्ड को कवर करता है।
गौचो

10

UITextView में संपूर्ण चयन / कॉपी / पेस्ट मेनू को निष्क्रिय करने का यह सबसे आसान तरीका है

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{    
    [UIMenuController sharedMenuController].menuVisible = NO;
    return NO;    
}

UITextField के लिए भी काम करता है। साझा करने के लिए धन्यवाद।
गौरव श्रीवास्तव

1
मैं ऊपर दिए गए कोड का उपयोग कर रहा हूं फिर भी मुझे मेनू मिल रहा है कि कृपया मुझे कैसे अक्षम करें।
बिट्टू

4

IOS 7 के बाद से UITextView पर एक संपत्ति है:

 @property(nonatomic,getter=isSelectable) BOOL selectable;

यह पाठ चयन की अनुमति देने से एक दृष्टिकोण रखता है। मेरे लिए महान काम करता है।


4

यदि आप कीबोर्ड को एक के साथ बदलना चाह रहे हैं, तो मान लें UIPickerकि inputView(निश्चित रूप से एक टूलबार के रूप में inputAccesotyView), तो यह समाधान मदद करेगा ...

  • लागू textFieldShouldBeginEditing:
  • अंदर डाल दिया textField.userInteractionEnabled = NO;
  • फिर जब आप UIPickerViewइसे बंद करने वाले हों , तो इसे YES पर सेट करें।

ऐसा करने से, आप इस पर टैप करने UITextFieldऔर चुनने के विकल्पों को दिखा सकेंगे UIPickerView, इस समय आपकी UITextFieldइच्छा, वास्तव में, किसी भी टच ईवेंट पर प्रतिक्रिया नहीं करेगा (इसमें कट, कॉपी और पेस्ट के लिए टच और होल्ड शामिल है)। हालाँकि, आपको यह याद रखना होगा कि जब आप बंद कर रहे हैं तो इसे हाँ में वापस सेट करना UIPickerViewहोगा, लेकिन आप UIPickerViewफिर से अपनी पहुँच नहीं बना पाएंगे ।

एकमात्र क्षण जब यह विफल होता है जब उपयोगकर्ता टैप करके और पकड़कर शुरू होता है UITextView, तो आप पहली बार फिर से कॉपी और पेस्ट देखेंगे। यही कारण है कि आपको हमेशा अपने इनपुट को मान्य करना चाहिए। यह सबसे आसान है जिसके बारे में मैं सोच सकता हूं। अन्य विकल्प UILabelकेवल पढ़ने के लिए पाठ का उपयोग करना था, लेकिन आप बहुत अधिक कार्यक्षमता से चूक जाते हैं UITextView


4

उपवर्ग UITextView - स्विफ्ट 4.0

     override public func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }

कितना अजीब है? यह अभी भी "पेस्ट" विकल्प दिखाता है, लेकिन इसे दबाए जाने पर ऐसा न करें ...
iOS फ्लो

4

यदि आप पॉपअप को अक्षम करना चाहते हैं UITextFieldतो UITextFieldDelegateटॉगल करने के लिए इस विधि का प्रयास करें isUserInteractionEnabled

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    textField.isUserInteractionEnabled = false
    return true
}
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
    textField.isUserInteractionEnabled = true
    return true
}

3

इसे स्टोरीबोर्ड (Xcode 6) में आसानी से किया जा सकता है। गुणों में निरीक्षक में केवल संपादन योग्य और चयन को अनचेक करें। आप अभी भी पाठ दृश्य को स्क्रॉल कर सकते हैं।यहां छवि विवरण दर्ज करें


3

इसने मेरे लिए काम किया। सुनिश्चित करें कि आप textView पर resignFirstResponder को कॉल कर रहे हैं

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
  [self.textView resignFirstResponder];
  return NO;
}

2

मैं एक काम कर रहे उत्तर प्रदान किया यहाँ अक्षम पाठ चयन + ताल करने के लिए, रखते हुए clikable लिंक आशा है कि मदद करता है सक्षम:

काफी लंबे समय के प्रयास के बाद, मैं एक UITextView उपवर्ग पर AddGestureRecognizer को ओवरराइड करके टेक्स्ट चयन, आवर्धन, और डेटा का पता लगाने (लिंक क्लिक करने योग्य आदि) को रोकने में कामयाब रहा, केवल UILongPressGestureRecognizer को छूने में देरी की अनुमति देता है:

UIUnselectableTextView.m

-(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
    if([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]] && gestureRecognizer.delaysTouchesEnded)
    {
        [super addGestureRecognizer:gestureRecognizer];
    }
}


2

आप इन बॉक्स को अनचेक करके अपने स्टोरीबोर्ड में इसे ठीक कर सकते हैं:

यहां छवि विवरण दर्ज करें

या आप प्रोग्राम को ऐसे सेट कर सकते हैं:

textView.selectable = false
textView.editable = false

1

मैंने यह कर दिया है। मेरे 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;
        }

    }
}

और यह मेरे लिए काम किया। धन्यवाद।


1

तीव्र

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.

1

यदि आप अपने UITextView में एक कस्टम विकल्प जोड़ना चाहते हैं, लेकिन मौजूदा फ़ंक्शंस को निष्क्रिय कर दें तो आप इसे स्विफ्ट 3 पर कैसे करें :

कॉपी, पेस्ट, कट फंकसिटी को निष्क्रिय करने के लिए एक उपवर्ग बनाएं और निम्नलिखित को ओवरराइड करें:

override public func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    return false
} 

ViewController पर आप अपने CustomTextView अपने विकल्पों को जोड़ने के लिए निम्नलिखित जोड़ें:

  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)")

    }

1

यह विधि पूरी तरह से सेलेक्ट, सेलेक्ट ऑल, पेस्ट मेन्यू को डिसेबल कर देगी। यदि आप अभी भी कुछ अन्य कार्रवाई करते हैं, तो नीचे दी गई शर्त के अनुसार इसे जोड़ें।

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

0

आप इस तरह श्रेणी बना सकते हैं:

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

1
यह इसे हल करने का एक अच्छा तरीका नहीं है। सबसे पहले यह सब कुछ प्रभावित करता है, क्योंकि यह श्रेणी में है। दूसरी बात, आसान काम के लिए संबद्ध वस्तुओं का उपयोग करने से डिबगिंग के साथ बाद में और अधिक परेशानी हो सकती है (क्यों यह काम करता है जब आप भूल गए कि आपने क्या किया) लाभ देने के बजाय। मेरी राय में जब भी संभव हो, इससे बचना अच्छा है। प्रोजेक्ट में नए प्रोग्रामर को खोजने और डिबग करने और समझने में कम आसान कोड बनाता है।
Vive

0

उप UITextView- - (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizerकार्रवाई और ओवरराइडिंग अवांछित कार्यों को अक्षम करने की एक और संभावना है।

gestureRecognizerकार्रवाई को जोड़ा जाना चाहिए या नहीं, यह तय करने के लिए -object की कक्षा का उपयोग करें ।


0

(स्विफ्ट) यदि आप मेनू विकल्पों या आवर्धक ग्लास के साथ सिर्फ एक मूल पाठ क्षेत्र चाहते हैं, तो UITextField का एक उपवर्ग बनाएं जो जेस्चर पर वापस जा रहा है ।RecognizerShouldBegin:

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()

0
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)}

0

स्विफ्ट 3

ऐसा करने के लिए, आपको अपना UITextView उप-वर्ग करना होगा और यह विधि डालनी होगी।

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)
    }

0

UITextView के पास दो प्रॉपर्टी हैं जो आपको चाहिए: iselectable and isEditable

सेटिंग करना गलत है आप टेक्स्ट को संपादित करने के लिए उपयोगकर्ता से बचेंगे और सेट करने के लिए अक्षम्य है, आप उपयोगकर्ता को अपने टेक्स्ट व्यू के अंदर पाठ का चयन करने से बचेंगे ताकि यह कार्रवाई मेनू को दिखाने से रोके।


0

कृपया संदर्भ के लिए नमूना कोड खोजें:

 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
    }

-1

के 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
    }
}

StopPasteAction.swift नाम से एक नया वर्ग बनाएं

import UIKit

class StopPasteAction: UITextField {

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }
}

अपने साथ नई टेक्स्ट क्लास जोड़ें

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.