কীভাবে ইউআইটিেক্সটফিল্ড সম্পাদনা অক্ষম করবেন তবে তবুও স্পর্শ গ্রহণ করবেন?


107

আমি UITextFieldযে একটি UIPickerViewহিসাবে তৈরি করছি inputView। এটি সর্বোত্তম, ব্যতীত আমি অনুলিপি, পেস্ট, কাটা এবং পাঠ্য নির্বাচন করে সম্পাদনা করতে পারি এবং আমি এটি চাই না। কেবল পিকারের পাঠ্য ক্ষেত্রটি পরিবর্তন করা উচিত।

আমি শিখেছি যে, আমি সেট করে সম্পাদনা নিষ্ক্রিয় করতে পারেন setEnabledবা setUserInteractionEnabledকরতে NO। ঠিক আছে, তবে টেক্সটফিল্ড স্পর্শে সাড়া দেওয়া বন্ধ করে এবং পিকারটি প্রদর্শিত হবে না।

এটি অর্জনে আমি কী করতে পারি?

উত্তর:


131

পাঠ্যক্ষেত্রের প্রতিনিধি ব্যবহার করে একটি পদ্ধতি আছে

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

এটি থেকে কোনও ফিরিয়ে দিন না, এবং ব্যবহারকারী দ্বারা পাঠ্য সম্পাদনা করার যে কোনও প্রচেষ্টা প্রত্যাখ্যান করা হবে।

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


4
আপনি যদি এখনও স্পর্শে প্রতিক্রিয়া জানাতে চান তবে "টাচ ডাউন" তে সাড়া দিন এবং "অভ্যন্তরে স্পর্শ করবেন না"। অন্যথায় আপনার ইভেন্টটি কখনই ডাকা হয় না।
রেডভেন

@ নিকলোকউডের এমন কোনও উপায় রয়েছে যা আমরা এখনও টেক্সটফিল্ডটিকে প্রথম প্রতিক্রিয়াকারী হতে দিতে পারি, তবে ব্যবহারকারীর ইন্টারঅ্যাকশনটি অক্ষম করে এবং ক্যারেটটি আড়াল করি?
onmyway133

1
@ এন্ট্রপি আমি ধরে নিচ্ছি আপনি সামগ্রীটি নির্বাচন করতে সক্ষম হতে চান যাতে ব্যবহারকারী এটি অনুলিপি করতে পারে? আপনি যদি ইউটিএসটিফিল্ড সাবক্লাস করেন তবে আপনি যে কোনও আচরণকে ছাড়িয়ে যেতে পারেন - যেমন আপনি ব্যবহারকারীকে স্পর্শ করুন যখনই ক্ষেত্রটি সর্বদা নির্বাচন করতে বাধ্য করতে পারেন, যা কার্যকরভাবে ক্যারেটটি আড়াল করবে।
নিক লকউড

1
@ লরিলরি এটি একই, পরিবর্তে প্রতিনিধি পদ্ধতির জন্য সুইফট সিনট্যাক্সটি ব্যবহার করুন।
নিক লকউড

5
আরও যথাযথভাবে আমরা প্রয়োজনে "টেক্সটফিল্ডশোল্ডব্যাগইনএডিটিং" ব্যবহার করতে পারি
নবীন শান

22

দ্রুত উত্তর নিক নিকট অনুবাদ করুন :

পি / এস: মিথ্যা ফিরুন => পাঠ্যক্ষেত্রগুলি কীবোর্ড দ্বারা সম্পাদনা করতে পারে না। এটি কেবল কোড দ্বারা পাঠ্য সেট করতে পারে EX EX: textField.text = "আমার স্ট্রিং এখানে"

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

3
এটি আমার পক্ষে কাজ করে না। জুমটি উপস্থিত না হওয়া এবং আইওএস কাট / অনুলিপি / পেস্ট মেনু উপস্থিত না হওয়া পর্যন্ত পাঠ্য ক্ষেত্রটিতে কেবল দীর্ঘ ক্লিক করুন এবং আমি পাঠ্যটি পরিবর্তন করতে এটি ব্যবহার করতে পারি।
রোয়ানপিডি

2
সুইফট 4: `ফান্ট টেক্সটফিল্ড (_ টেক্সটফিল্ড: ইউআইটিেক্সটফিল্ড, shouldChageCharactersIn সীমা: এনএসরেঞ্জ, রিপ্লেসমেন্ট স্ট্রিং: স্ট্রিং) -> বুল {প্রত্যাবর্তন মিথ্যা}`
লিওনেলো

16

এটি সবার মধ্যে সহজতম হবে:

ভিডডিডোডে: (কেবল পাঠ্যক্ষেত্রের জন্য প্রতিনিধি সেট করুন যা সম্পাদনযোগ্য নয়।

self.textfield.delegate=self;

এবং এই প্রতিনিধি ফাংশন sertোকান:

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

এটাই!


27
এটি বাছাইকারীকে উপস্থাপিত হতে বাধা দেয় এবং তাই বর্ণিত সমস্যাটি ঠিক করে না
মার্টিন লকেট

6
@ মার্টিনলোকট যদি আপনি 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যে আয় NOসব কলের জন্য canPerformAction:withSender:(বা অন্তত যেখানে actionহয় @selector(cut)বা @selector(paste)হিসাবে বর্ণনা), এখানে

এছাড়াও, আমি প্রয়োগ করেছি - (BOOL) টেক্সটফিল্ড: (ইউআইটিেক্সটফিল্ড *) টেক্সটফিল্ডটি চেঞ্জকার্যাক্টরসইনরেঞ্জ: (এনএসরেঞ্জ) রেঞ্জ রিপ্লেসমেন্টস্ট্রিং: (এনএসএসআরটিং *) স্ট্রিংটি ব্লুটুথ কীবোর্ডগুলি থেকে ইনপুট পাঠ্য অক্ষম করার জন্য নিকের পরামর্শ অনুযায়ী as


কীভাবে এটি করা যায় তা আমার জীবনের জন্য কাজ করতে পারে না। সাবক্লাস canPerformActionএবং shouldChangeCharactersInRangeপদ্ধতিগুলি কখনই ডাকা হয় না।
নেস্টর

7

কেবলমাত্র একটি ইউআইবাটনকে পুরো ইউআইটিেক্সটফিল্ডের ঠিক ঠিক কোনও লেবেল-পাঠ্য না দিয়ে এটিকে "অদৃশ্য" করে রাখুন। এই বোতামটি টেক্সটফিল্ডের পরিবর্তে স্পর্শগুলি গ্রহণ করতে ও প্রতিনিধিত্ব করতে পারে এবং টেক্সটফিল্ডের সামগ্রীটি এখনও দৃশ্যমান।


7

সুইফটে:

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

3

আমি মিঃমেজ দ্বারা প্রদত্ত সমাধানটি ব্যবহার করেছি। কেবলমাত্র আমি যুক্ত করব হ'ল আপনি প্রথম প্রতিক্রিয়াকারী হিসাবে ইউআইটিেক্সটভিউ থেকে পদত্যাগ করুন, অন্যথায় আপনি নির্বাচিত পাঠ্যটির সাথে আটকে আছেন।

আমার সুইফট কোডটি এখানে:

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 এবং অ্যাকশন শীট পরিচালনা করে এমন বিকল্পের জন্য, অ্যাকশনশিটপিকার চেকআউট করুন

https://github.com/TimCinel/ActionSheetPicker

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

আমি প্রাথমিকভাবে চেকমার্কড উত্তরের মতো একটি সমাধান শুরু করেছি, তবে এই প্রকল্পে হোঁচট খেয়েছি এবং কোপোড ব্যবহার সহ আমার অ্যাপ্লিকেশনগুলিতে জিনিসগুলিকে একীভূত করতে প্রায় 20 মিনিট সময় নিয়েছি: অ্যাকশনশিটপিকার (0.0> 0.0)

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

গিট প্রকল্পটি ডাউনলোড করুন এবং নিম্নলিখিত ক্লাসগুলি দেখুন:

  • 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/skyvind/ActionSheetPicker-3.0
নিক এন

1

মানগুলি (সুইফটে) নির্বাচন করার জন্য ইউআইপিকারকারভিউ ব্যবহার করার সময় ইউআইটিেক্সটফিল্ড সম্পাদনা রোধ করতে:

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

এই workaround কাজ করে। পাঠ্য ক্ষেত্রের উপরে একটি স্বচ্ছ ইউআইভিউ রাখুন এবং নিম্নলিখিত কোডটি প্রয়োগ করুন:

- (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 + টাচআপসিনসাইড ব্যবহার করবেন না তা নিয়ে আমি বিভ্রান্ত হয়ে পড়েছি এবং এর পরিবর্তে ইউআইভিউ + অঙ্গভঙ্গিটি বেছে নিয়েছি।
চেন লি ইওং

0

আপনার ইনপুটভিউকে কোনও লুকানো টেক্সটফিল্ড দ্বারা উপস্থাপিত করুন যা উপস্থাপিত এবং অক্ষম হওয়াটির পাঠ্যও পরিবর্তন করে।


-5

আমি ব্যবহার করতাম :

[self.textField setEnabled:NO];

এবং এর কাজ সূক্ষ্ম


-7

এটি আমার জন্য কাজ করেছে [textview setEditable:NO]; উপরের উত্তরগুলি পরিস্থিতিটিকে জটিল করে তুলছে।


1
ওপি লিখেছিল "আমি শিখেছি যে আমি সেটএইনবেলড বা সেট-ইউজার-ইন্টেরাকশনএইনবেবলড সেট করে এডিটিংটি অক্ষম করতে পারি: না, না, ঠিক আছে, তবে টেক্সটফিল্ড স্পর্শে সাড়া দেওয়া বন্ধ করে এবং পিকারটি প্রদর্শিত হবে না।" আপনার উত্তর সমস্ত ইভেন্ট বন্ধ করবে, যা পছন্দসই ফলাফল ছিল না।
মানিনভান

@ টোলগাব এই ওপির জন্য এমনকি সম্পর্কিত সমাধান নয়!
অনুরাগ শর্মা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.