UITextField संपादन को अक्षम कैसे करें लेकिन फिर भी स्पर्श स्वीकार करें?


107

मैं एक है UITextFieldकि एक के UIPickerViewरूप में कर रहा हूँ inputView। यह सब अच्छा है, सिवाय इसके कि मैं कॉपी, पेस्ट, कट और टेक्स्ट का चयन करके संपादित कर सकता हूं, और मुझे यह नहीं चाहिए। केवल पिकर को पाठ क्षेत्र को संशोधित करना चाहिए।

मैंने सीखा है कि मैं सेट करके संपादन निष्क्रिय कर सकते हैं setEnabledया setUserInteractionEnabledकरने के लिए NO। ठीक है, लेकिन TextField छूने का जवाब देना बंद कर देता है और लेने वाला दिखाई नहीं देता।

मैं इसे हासिल करने के लिए क्या कर सकता हूं?

जवाबों:


131

टेक्स्टफील्ड प्रतिनिधि का उपयोग करना, एक विधि है

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

इससे NO लौटें, और उपयोगकर्ता द्वारा पाठ को संपादित करने का कोई भी प्रयास अस्वीकार कर दिया जाएगा।

इस तरह आप सक्षम किए गए फ़ील्ड को छोड़ सकते हैं लेकिन फिर भी इसमें टेक्स्ट चिपकाने वाले लोगों को रोक सकते हैं।


4
यदि आप अभी भी स्पर्श करने के लिए प्रतिसाद देना चाहते हैं, तो "स्पर्श करें" पर प्रतिसाद दें न कि "अंदर स्पर्श करें"। अन्यथा आपकी घटना को कभी नहीं बुलाया जाता है।
radven

@NickLockwood ऐसे कोई भी तरीके हैं जिनसे हम अभी भी टेक्स्टफिल्ड को पहला उत्तरदाता बनने की अनुमति दे सकते हैं, लेकिन उपयोगकर्ता इंटरैक्शन को अक्षम कर सकते हैं और कैरेट को छिपा सकते हैं?
onmyway133

1
@entropy मैं मान रहा हूं कि आप सामग्री का चयन करने में सक्षम होना चाहते हैं ताकि उपयोगकर्ता इसे कॉपी कर सके? यदि आप UITextField को उपवर्गित करते हैं, तो आप किसी भी व्यवहार को बहुत अधिक ओवरराइड कर सकते हैं - जैसे आप उपयोगकर्ता को छूने पर हमेशा सभी को चुनने के लिए फ़ील्ड को बाध्य कर सकते हैं, जो प्रभावी रूप से कैरेट को छिपाएगा।
निक लॉकवुड

1
@ लॉरी लॉरी समान है, केवल प्रतिनिधि पद्धति के लिए स्विफ्ट सिंटैक्स का उपयोग करें।
निक लॉकवुड

5
यदि आवश्यक हो तो अधिक सटीक रूप से हम "textFieldShouldBeginEditing" का उपयोग कर सकते हैं
नवीन शान

22

तेजी से निक के उत्तर का अनुवाद करें :

P / S: गलत तरीके से लौटें>> टेक्स्टफिल्ड कीबोर्ड द्वारा संपादित नहीं कर सकता है। यह सिर्फ text.EX द्वारा पाठ सेट कर सकता है: textField.text = "मेरी स्ट्रिंग यहाँ"

override func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    return false
}

3
यह मेरे लिए काम नहीं करता है। जूम दिखाई देने तक बस टेक्स्ट फील्ड पर क्लिक करें और iOS कट / कॉपी / पेस्ट मेन्यू दिखाई दे और मैं उस टेक्स्ट को बदलने के लिए उपयोग कर सकता हूं।
रोवनपीड

2
स्विफ्ट 4: `फंक टेक्स्टफिल्ड (_ textField: UITextField, shouldChangeCharactersIn रेंज: NSRange, रिप्लेसमेंटस्ट्रिंग स्ट्रिंग: स्ट्रिंग) ->
बूल

16

यह सब से सरल होगा:

viewDidLoad में: (केवल डेलिगेट को टेक्स्टफील्ड के लिए सेट करें, जो संपादन योग्य नहीं होना चाहिए।

self.textfield.delegate=self;

और इस प्रतिनिधि समारोह को सम्मिलित करें:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
return NO;
}

बस!


27
यह पिकर को प्रस्तुत करने से रोकता है और इसलिए वर्णित समस्या को ठीक नहीं करता है
मार्टिन लॉकेट

6
@MartinLockett यदि आप UIPickerViewउस प्रतिनिधि विधि से व्यवहार को ट्रिगर करते हैं, तो यह अच्छी तरह से काम करता है।
अल्बर्ट बोरी

9

स्विफ्ट 3+ में:

class MyViewController: UIViewController, UITextFieldDelegate {

   override func viewDidLoad() {
      self.myTextField.delegate     = self
   }

   func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
      if textField == myTextField {
         // code which you want to execute when the user touch myTextField
      }
      return false
   }
}

7

जैसा कि यहां बताया गया है, (या कम से कम जहां है या है ) सभी कॉल के लिए UITextFieldउस रिटर्न का एक कस्टम उपवर्ग बनाना अधिक सुरुचिपूर्ण होगा ।NOcanPerformAction:withSender:action@selector(cut)@selector(paste)

इसके अलावा, मैं भी लागू करूंगा - (BOOL) टेक्स्टफिल्ड: (UITextField *) textField shouldChangeCharactersInRange: (NSRange) रेंज रिप्लेसमेंटस्ट्रिंग: (NSString *) स्ट्रिंग ब्लूटूथ कीबोर्ड से टेक्स्ट को अक्षम करने के लिए निक के सुझाव के रूप में।


मेरे जीवन के लिए काम नहीं कर सकता कि कैसे करना है। उपवर्ग canPerformActionऔर shouldChangeCharactersInRangeविधियों को कभी नहीं कहा जाता है।
नेस्टर

7

बस एक UIButton को पूरी तरह से पूरे UITextField में बिना किसी लेबल-पाठ के साथ रखें जो इसे "अदृश्य" बनाता है। यह बटन टेक्स्टफील्ड के बजाय टच को प्राप्त और प्रतिनिधि कर सकता है और टेक्स्टफिल्ड की सामग्री अभी भी दिखाई देती है।


7

स्विफ्ट में:

func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
    questionField.resignFirstResponder();
    // Additional code here
    return false
}

3

मैंने MrMage द्वारा प्रदान किए गए समाधान का उपयोग किया। केवल एक चीज जो मैं आपको बताऊंगा वह है यूआईटेक्स्ट्यूव को पहले उत्तरदाता के रूप में इस्तीफा देना चाहिए, अन्यथा आप चयनित पाठ के साथ फंस गए हैं।

यहाँ मेरा स्विफ्ट कोड है:

class TouchableTextView : UITextView {

    override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
        self.resignFirstResponder()
        return false
    }

    override func shouldChangeTextInRange(range: UITextRange, replacementText text: String) -> Bool {
        self.resignFirstResponder()
        return false
    }

}

1

UIPickerView और एक्शन शीट्स को हैंडल करने वाले विकल्प के लिए, ActionSheetPicker चेकआउट करें

https://github.com/TimCinel/ActionSheetPicker

यह कोकोपोड्स सक्षम है। यह एक्शन शीट पर सभी रद्द और किए गए बटन को संभालता है। नमूना परियोजना के भीतर के उदाहरण महान हैं। मैं ActionSheetStringPicker को चुनता हूं, जो आसानी से स्ट्रिंग आधारित विकल्पों को आसानी से संभालती है, लेकिन एपीआई सबसे ज्यादा कुछ भी संभाल सकती है, जिसके बारे में मैं सोच सकता हूं।

मैंने मूल रूप से चेकमार्क किए गए उत्तर की तरह एक समाधान शुरू किया, लेकिन इस परियोजना पर ठोकर खाई और मुझे लगभग 20 मिनट का समय लगा, ताकि मैं अपने ऐप को cocopods का उपयोग करने सहित उपयोग के लिए एकीकृत कर पाऊं: ActionSheetPicker (~> 0.0)

उम्मीद है की यह मदद करेगा।

Git प्रोजेक्ट डाउनलोड करें और निम्नलिखित कक्षाओं को देखें:

  • ActionSheetPickerViewController.m
  • ActionSheetPickerCustomPickerDelegate.h

यहाँ मोटे तौर पर अधिकांश कोड जो मैंने जोड़े हैं, प्लस * .h आयात।

- (IBAction)gymTouched:(id)sender {
      NSLog(@"gym touched");

      [ActionSheetStringPicker showPickerWithTitle:@"Select a Gym" rows:self.locations initialSelection:self.selectedIndex target:self successAction:@selector(gymWasSelected:element:) cancelAction:@selector(actionPickerCancelled:) origin:sender];
 }


- (void)actionPickerCancelled:(id)sender {
    NSLog(@"Delegate has been informed that ActionSheetPicker was cancelled");
}


- (void)gymWasSelected:(NSNumber *)selectedIndex element:(id)element {
    self.selectedIndex = [selectedIndex intValue];

    //may have originated from textField or barButtonItem, use an IBOutlet instead of element
    self.txtGym.text = [self.locations objectAtIndex:self.selectedIndex];
}


-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    return NO;  // Hide both keyboard and blinking cursor.
}

फली का एक अद्यतन संस्करण यहाँ है। github.com/skywinder/ActionSheetPicker-3.0
निक एन

1

मूल्यों के चयन के लिए UIPickerView का उपयोग करते समय UITextField के संपादन को रोकने के लिए (स्विफ्ट में):

self.txtTransDate = self.makeTextField(self.transDate, placeHolder: "Specify Date")
self.txtTransDate?.addTarget(self, action: "txtTransDateEditing:", forControlEvents: UIControlEvents.EditingDidBegin)

func makeTextField(text: String?, placeHolder: String) -> UITextField {
    var textField = UITextField(frame: CGRect(x: 140, y: 0, width: 220.00, height: 40.00));
    textField.placeholder = placeHolder
    textField.text = text
    textField.borderStyle = UITextBorderStyle.Line
    textField.secureTextEntry = false;
    textField.delegate = self
    return textField
}


func txtTransDateEditing(sender: UITextField) {
    var datePickerView:UIDatePicker = UIDatePicker()
    datePickerView.datePickerMode = UIDatePickerMode.Date
    sender.inputView = datePickerView
    datePickerView.addTarget(self, action: Selector("datePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged)
}

func datePickerValueChanged(sender: UIDatePicker) {
    var dateformatter = NSDateFormatter()
    dateformatter.dateStyle = NSDateFormatterStyle.MediumStyle
    self.txtTransDate!.text = dateformatter.stringFromDate(sender.date)
}

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool  {
    self.resignFirstResponder()
    return false
}

0

यह वर्कअराउंड काम करता है। पाठ क्षेत्र के ऊपर एक पारदर्शी UIView लगाएं और निम्नलिखित कोड लागू करें:

- (void)viewDidLoad
{
 [super viewDidLoad];

   UILongPressGestureRecognizer *press = [[UILongPressGestureRecognizer alloc]             initWithTarget:self action:@selector(longPress)];
[transparentView addGestureRecognizer:press];
 [press release];
  press = nil;
}

-(void)longPress
{
   txtField.userInteractionEnabled = NO;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
   txtField.userInteractionEnabled = YES;
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
  [txtField becomeFirstResponder];
}

1
मुझे इस बात का भ्रम है कि आप एक साधारण पारदर्शी UIButton + touchUpInside का उपयोग क्यों नहीं करते हैं, और इसके बजाय UIView + इशारा का विकल्प चुना है।
चेन ली योंग

0

अपना इनपुट दृश्य एक छिपे हुए टेक्स्टफ़ील्ड द्वारा प्रस्तुत किया जाए जो प्रस्तुत और अक्षम एक के टेक्स्ट को भी बदल दे।


-5

मैंनें इस्तेमाल किया :

[self.textField setEnabled:NO];

और इसका काम ठीक है


-7

यह मेरे लिए काम करता है [textview setEditable:NO]; उपरोक्त उत्तर स्थिति को ओवरकॉम्प्लिकेट कर रहे हैं।


1
ओपी ने लिखा है "मुझे पता चला है कि मैं setEnabled या setUserInteractionEnabled को सेट करके संपादन को अक्षम कर सकता हूं। NO। आपका जवाब सभी घटनाओं को रोक देगा, जो वांछित परिणाम नहीं था।
मणिनवन

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