খালি ইউআইটিেক্সটফিল্ডে ব্যাকস্পেস সনাক্ত করুন


126

খালি যে আইফোন কীবোর্ডে Backspace/ Deleteকী টিপানো হয় তা সনাক্ত করার কোনও উপায় আছে UITextField? আমি জানতে চাই কখন Backspaceচাপবে কেবলমাত্র যদি UITextFieldখালি থাকে।


একটি মন্তব্যে @ অ্যালেক্স রেনল্ডসের পরামর্শের ভিত্তিতে, আমি আমার পাঠ্য ক্ষেত্রটি তৈরি করার সময় নিম্নলিখিত কোড যুক্ত করেছি:

[[NSNotificationCenter defaultCenter] addObserver:self
          selector:@selector(handleTextFieldChanged:)
              name:UITextFieldTextDidChangeNotification
            object:searchTextField];

এই বিজ্ঞপ্তিটি পেয়েছে ( handleTextFieldChangedফাংশন বলা হয়), তবে এখনও আমি Backspaceখালি ক্ষেত্রে কী টিপব না not কোন ধারনা?


এই প্রশ্নটি সম্পর্কে কিছু বিভ্রান্তি রয়েছে বলে মনে হচ্ছে। Backspaceকীটি চাপলে আমি একটি বিজ্ঞপ্তি পেতে চাই । এটাই. সমাধানটি অবশ্যই কাজ করবে যখন UITextFieldইতিমধ্যে খালি রয়েছে।


আমি মনে করি আপনি কেবল "কীবোর্ড খালি থাকলে" "ইউআইটিেক্সটফিল্ডটি খালি থাকলে" বলতে চাইছেন ...?
স্টিভ হ্যারিসন

@ স্টিভ হ্যারিসন: ধন্যবাদ আপডেট হয়েছে।
মার্কসি

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

রানটাইম ট্র্যাকারি ব্যবহার করে ফাঁকা ইউআইটিেক্সটফিল্ডের জন্য 2011/11 সমাধান : bjhomer.blogspot.com/2011/11/…
জানো

4
হাস্যকরভাবে তাই তুচ্ছ কিছু জন্য দীর্ঘ। এটি কঠিন হতে হবে না।
অ্যাডাম ওয়েট

উত্তর:


36

এটি দীর্ঘ শট হতে পারে তবে এটি কার্যকর হতে পারে। পাঠ্য ক্ষেত্রের পাঠ্যটি শূন্য প্রস্থের অক্ষরটিতে সেট করার চেষ্টা করুন \u200B। যখন ব্যাকস্পেসটি এমন কোনও পাঠ্য ক্ষেত্রে চাপ দেওয়া হয় যা খালি দেখা দেয়, এটি আসলে আপনার স্থানটি মুছে ফেলবে। তারপরে আপনি কেবল স্থানটি পুনরায় সন্নিবেশ করতে পারেন।

যদি ব্যবহারকারী ক্যারেটটি স্থানের বাম দিকে সরানোর ব্যবস্থা করে তবে কাজ করতে পারে না।


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

2
এই কৌশলটি আইফোন> ৩.১.৩ এ কাজ করতে পারে তবে এটি হ্যাকি এবং ভবিষ্যতের সংস্করণগুলি ইত্যাদির উপর ভেঙে যেতে পারে I আমি মনে করি যে আমি আইফোন / আইওএস-এ কীভাবে মুছে ফেলা কী-বোর্ড কী কীভাবে সনাক্ত করতে পারি তার জন্য আরও একটি স্থিতিশীল সমাধান পেয়েছি ।
ma11 শেই 28

6
আমি নিশ্চিত করতে পারি যে ব্যবহারকারী যদি স্থানটির বাম দিকে কার্সারটি স্থানান্তরিত করে পরিচালনা করে তবে মুছে ফেলা সনাক্ত করা যায়নি। আপনি চিন্তা করতে পারেন যে ঠিক কিভাবে, তারপর আপনি উপশ্রেণী উচিত UITextFieldএবং বাস্তবায়ন canPerformAction:withSender:করার return NOজন্য select:এবং selectAll:কর্ম যখন টেক্সট স্ট্রিং সমান @"\u200B"
ma11 শেই 28

2
সমস্যা হ'ল এটি নিরাপদ পরীক্ষার ক্ষেত্রগুলির জন্য কাজ করে না। কোনও ধারণা কীভাবে এটি পরিচালনা করবেন?
কাইল Clegg

7
দুঃখিত, তবে এই ধারণাটি খারাপ। এটি অবিশ্বাস্য হ্যাক এবং 30 বা ততোধিক উর্ধ্বে থাকা গ্রহণযোগ্য উত্তর হওয়া উচিত নয়। আমি পরিবর্তে ইউআইটিেক্সটফিল্ড সাবক্লাস করব, অন্য মন্তব্যকারীদের কিছু উল্লেখ করেছেন like
ব্রায়ান সাচেটা

155

সুইফট 4:


সাবক্লাস UITextField:

// MyTextField.swift
import UIKit

protocol MyTextFieldDelegate: AnyObject {
    func textFieldDidDelete()
}

class MyTextField: UITextField {

    weak var myDelegate: MyTextFieldDelegate?

    override func deleteBackward() {
        super.deleteBackward()
        myDelegate?.textFieldDidDelete()
    }

}

বাস্তবায়ন:

// ViewController.swift

import UIKit

class ViewController: UIViewController, MyTextFieldDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // initialize textField
        let input = MyTextField(frame: CGRect(x: 50, y: 50, width: 150, height: 40))

        // set viewController as "myDelegate"
        input.myDelegate = self

        // add textField to view
        view.addSubview(input)

        // focus the text field
        input.becomeFirstResponder()
    }

    func textFieldDidDelete() {
        print("delete")
    }

}

উদ্দেশ্য গ:


সাবক্লাস UITextField:

//Header
//MyTextField.h

//create delegate protocol
@protocol MyTextFieldDelegate <NSObject>
@optional
- (void)textFieldDidDelete;
@end

@interface MyTextField : UITextField<UIKeyInput>

//create "myDelegate"
@property (nonatomic, assign) id<MyTextFieldDelegate> myDelegate;
@end

//Implementation
#import "MyTextField.h"

@implementation MyTextField

- (void)deleteBackward {
    [super deleteBackward];

    if ([_myDelegate respondsToSelector:@selector(textFieldDidDelete)]){
        [_myDelegate textFieldDidDelete];
    }
}

@end

এখন কেবল যোগ MyTextFieldDelegate আপনার টু UIViewControllerএবং আপনার সেট UITextFields myDelegate করতে self:

//View Controller Header
#import "MyTextField.h"

//add "MyTextFieldDelegate" to you view controller
@interface ViewController : UIViewController <MyTextFieldDelegate>
@end

//View Controller Implementation
- (void)viewDidLoad {
    //initialize your text field
    MyTextField *input = 
     [[MyTextField alloc] initWithFrame:CGRectMake(0, 0, 70, 30)];

    //set your view controller as "myDelegate"
    input.myDelegate = self;

    //add your text field to the view
    [self.view addSubview:input];
}

//MyTextField Delegate
- (void)textFieldDidDelete {
    NSLog(@"delete");
}

9
এটিই সেরা সমাধান। উত্তর গৃহীত হ্যাক হয়। উদ্দেশ্য সি উপ-শ্রেণিবদ্ধের উপর ভিত্তি করে এবং সমাধানটি সমস্যার সমাধানের জন্য এটি সঠিকভাবে ব্যবহার করে।
টিজে

ViewController ক্লাসে আমার বিদ্যমান প্রতিনিধি পদ্ধতিগুলির কি হবে যদি আমি আমার টেক্সটফিল্ডের প্রতিনিধিটিকে UITextFieldপরিবর্তে সাবক্লাসে সেট করিUIViewController
রোহান-প্যাটেল

4
অ্যাপল বাগের মতো মনে হচ্ছে, এটি আপাতত ios8 এ কাজ করে না: devforums.apple.com/message/1045312#1045312
chug2k

1
আমি আমার উত্তর হিসাবে আইওএস 8 বাগের জন্য একটি কার্যনির্বাহী দ্রবণ ব্যবহার করেছি এবং এটি কার্যকর হয়েছে। যারা সমাধানের সন্ধান করছেন তাদের পক্ষে এটি কার্যকর হতে পারে।
ফারকান 3 ইয়ারতক্তার

1
deleteBackward()যদি আপনি নামক করা হইনি return falseমধ্যেtextField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
igrrik

41

আপডেট: ওভাররাইডের একটি উদাহরণের জন্য জ্যাকবকারাবলোর উত্তর দেখুন -[UITextField deleteBackward]

দেখুন UITextInput, বিশেষত UIKeyInputএকটি deleteBackwardপ্রতিনিধি পদ্ধতি রয়েছে যা মুছুন কী টিপে গেলে সর্বদা ডাকা হয়। আপনি যদি কিছু সাধারণ করছেন, তবে আপনি কেবল সাবক্লাসিং UILabelএবং এটিকে UIKeyInputপ্রোটোকলের সাথে সামঞ্জস্য করা বিবেচনা করতে পারেন , যেমন সিম্পল টেক্সটইনপুট এবং এই আইফোন ইউআইকিআইপুট উদাহরণ দ্বারাদ্রষ্টব্য: UITextInputএবং এর আত্মীয়রা (সহ UIKeyInput) কেবলমাত্র আইওএস 3.2 এবং তারপরে উপলব্ধ।


2
এটি সঠিক উত্তর। এটি ইউআইটিেক্সটফিল্ডের একটি দ্রুত সাবক্লাস সহ অ-হ্যাকি এবং খুব সহজ।
স্যাম

সবে নীচে জ্যাকব এর উত্তর স্পট। এটি এর একটি বিশদ উদাহরণ দেয়।
স্যাম

এটি লক্ষণীয় যে এই আইওএসটি আইওএস 5 এ কাজ করে না the যদি পাঠ্য ক্ষেত্রটি খালি টিপে ব্যাকস্পেস হয় তবে এই পদ্ধতিটি গ্রহণ করবে না।
jfeldman

31

নীচের মত কোড:

@interface MyTextField : UITextField
@end

@implementation MyTextField

- (void)deleteBackward
{
    [super deleteBackward];

    //At here, you can handle backspace key pressed event even the text field is empty
}

@end

শেষ অবধি, পাঠ্য ক্ষেত্রের কাস্টম শ্রেণীর সম্পত্তিটি "মাই টেক্সটফিল্ড" এ পরিবর্তন করতে ভুলবেন না


5
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। পরিষ্কার, এবং আসলে প্রশ্নের উত্তর।
রায়ান রোমানচুক

1
এটি প্রশ্নের উত্তর দেয় ... যতক্ষণ আপনি আইওএস 6.0+ টার্গেট করছেন। আইওএস 5-এ, দুর্ভাগ্যক্রমে, ডিলেটব্যাকওয়ার্ডকে কখনও আপনার সাবক্লাসে কল করা হয়নি।
বিজে হোমার

2
বিজে হোমার, 93% ডিভাইসগুলি আইওএস 6 এ রয়েছে, সুতরাং আইওএস 5 কে টার্গেট না করা সাধারণত এত বড় বিষয় নয়।
জোনাথন

2
আমি খুশি যে আমি এটি সন্ধানের জন্য যথেষ্ট নিচে স্ক্রোল করে চলেছি। আইওএস
in-তে

আমি এই প্রশ্নের জন্য আরও অনেক উত্তর দেখেছি যা কেবলমাত্র কর্মক্ষেত্র, এবং এর মধ্যে খুব কমই কোনও পরিস্থিতি মোকাবেলা করে যেখানে ব্যাকস্পেস কীটি খালি ক্ষেত্রে চাপানো হয়েছিল। এটি তবে নিখুঁত এবং এটি করার একটি সত্যিকারের উপায়।
ক্রিস্টোফার হান্না

19

দ্রুত বাস্তবায়ন:

import UIKit

protocol PinTexFieldDelegate : UITextFieldDelegate {
    func didPressBackspace(textField : PinTextField)
}

class PinTextField: UITextField {

    override func deleteBackward() {
        super.deleteBackward()

        // If conforming to our extension protocol
        if let pinDelegate = self.delegate as? PinTexFieldDelegate {
            pinDelegate.didPressBackspace(self)
        }
    }
}

ধন্যবাদ, আমি জানতে পারি এই পদ্ধতিটি অ্যাপল দ্বারা প্রস্তাবিত বা এটি হ্যাক। এটি পাঠ্যক্ষেত্রের জন্য নিবন্ধিত বলে মনে হচ্ছে।
কল্পনেশ জেটানি

একটি পাঠ্য ভিউ দিয়ে আমার জন্য কাজ করেছেন। ভাগ করে নেওয়ার জন্য ধন্যবাদ;)
এডুয়ার্ড বার্বিয়ার

যখন পাঠ্যক্ষেত্রটি খালি থাকে এবং পিছনের স্থানটি ক্লিক করা হয় তখন আমার জন্য কাজ করে।
রামকৃষ্ণ

17

আমি subclassসমাধানের চেয়ে আরও সহজ উপায় স্থাপন করেছি । এমনকি এটির সামান্য বিস্ময়কর তবে এটি ঠিক আছে।

- (BOOL)textView:(UITextView *)textView 
        shouldChangeTextInRange:(NSRange)range 
        replacementText:(NSString *)text
{
    const char * _char = [text cStringUsingEncoding:NSUTF8StringEncoding];
    int isBackSpace = strcmp(_char, "\b");

    if (isBackSpace == -8) {
       // is backspace
    }

    return YES;
}

তুলনার ফলাফলের জন্য এটি কিছুটা আশ্চর্যজনক -8 হয়। আমি কিছু ভুল হতে পারে C Programming। তবে এটির সঠিক কাজ;)


1
ব্যাকস্ট্রোক '\ বি' সেট নয়। তবে আপনি যদি সাবধানে ডিবাগিং করেন তবে আপনি দেখতে পাবেন '\ 0'। সুতরাং আমি ফলাফলটি পেয়েছি যে দুটি মান দুটি স্ট্রিম্প পদ্ধতিতে সমান। কনস্ট চর * স্টোক = [পাঠ্য সিস্ট্রিং ইউজিং এনকোডিং: এনএসএএসসিআইআইএসটিআরইং কোডিং] কনস্ট চর * ব্যাকস্ট্রোক = "\ 0"; // এটি \ b -> "\ x08" এর সমান; strcmp (ব্যাকস্ট্রোক, স্টোক);
ইউনে লি

এছাড়াও, আরআরসিএমপি (এস 1, এস 2) এর সংজ্ঞা অনুসারে, এস 1 == এস 2,> 0 এস 1 এর বিপরীতে এস 2 এর তুলনামুলকভাবে বৃহত্তর হয়েছে returns
ইয়ুন লি

আমি বুঝতে পারি না কীভাবে এটি সম্ভবত কাজ করতে পারে? @ ইউনলি: আপনি কি strcmpরিটার্ন বলছেন না -1, 0, or 1? এটা আমার বোঝাপড়া ছিল।
chug2k

1
পাঠ্যদর্শনটিতে আপনি সর্বদা ব্যাকস্পেসটি সনাক্ত করে এমনকি কোনও পাঠ্য না থাকলেও ইউআইটিেক্সটফিল্ডটি আলাদা
লোলারআন

2
এটি একটি UITextViewDelegateপদ্ধতি, না UITextFieldDelegate
pkamb

11

চেষ্টা কর delegate

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

তারপরে পরীক্ষা করুন range.length == 1যা আঘাতের সময় কেসটি মনে হচ্ছে backspaceকিনা।


8
যদিও ক্ষেত্রটি খালি নয় কেবল তখনই ডাকা হয়। মূল প্রশ্নটি নোট করুন। :)
এরিক গোল্ডবার্গ

এর জন্য ইউআইটিেক্সটভিউ ব্যবহার করুন।
ওলেগ

11

দয়া করে নীচের কোডটি ব্যবহার করুন এটি আপনার পাঠ্যক্ষেত্র খালি থাকলেও কী-বোর্ড মুছা কী সনাক্ত করতে আপনাকে সহায়তা করবে।

উদ্দেশ্য গ :

- (BOOL)keyboardInputShouldDelete:(UITextField *)textField { return YES; }

দ্রুত:

func keyboardInputShouldDelete(_ textField: UITextField) -> Bool { return true }

Tx - ঠিক আমার যা প্রয়োজন। তবে কোথায় তা নথিভুক্ত ??
অ্যান্ডি ওয়েইনস্টেইন

9

নিক্লাস আলভায়েসের উত্তর আমাকে অনুরূপ ইস্যুতে সহায়তা করেছিল

আমি একটি নির্দিষ্ট চরিত্রের সেটটিতে প্রবেশ সীমাবদ্ধ করেছিলাম তবে এটি ব্যাকস্পেসগুলিকে উপেক্ষা করছে। সুতরাং আমি এটি range.length == 1ছাঁটাই করার আগে এটি পরীক্ষা করেছিলাম NSString। যদি এটি সত্য হয় তবে আমি কেবল স্ট্রিংটি ফিরিয়ে দেব এবং এটি ছাঁটাই করব না। নিচে দেখ

 - (BOOL) textField:(UITextField *)textField 
          shouldChangeCharactersInRange:(NSRange)range 
          replacementString:(NSString *)string
 {
     NSCharacterSet *nonNumberSet = 
      [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] 
         invertedSet];

    if (range.length == 1) {
       return string;
    }
    else {
       return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0);
    }   
 }

পদ্ধতিটি একটি বুলিয়ান প্রত্যাশা করে, রিটার্ন মান হিসাবে স্ট্রিং নয়
পাস্কালিয়াস

4

যাকোবের উত্তর সম্পর্কে যাদের সমস্যা রয়েছে তাদের জন্য আমি আমার পাঠ্যক্ষেত্রের সাবক্লাসটি নিম্নলিখিত হিসাবে প্রয়োগ করেছি এবং এটি দুর্দান্ত কাজ করে!

#import <UIKit/UIKit.h>

@class HTTextField;

@protocol HTBackspaceDelegate <NSObject>

@optional
- (void)textFieldDidBackspace:(HTTextField*)textField;
@end

@interface HTTextField : UITextField<UIKeyInput>

@property (nonatomic, assign) id<HTBackspaceDelegate> backspaceDelegate;

@end


#import "HTTextField.h"

@implementation HTTextField

- (void)deleteBackward {
    [super deleteBackward];
    if ([self.backspaceDelegate respondsToSelector:@selector(textFieldDidBackspace:)]){
        [self.backspaceDelegate textFieldDidBackspace:self];
    }
}

- (BOOL)keyboardInputShouldDelete:(UITextField *)textField {
    BOOL shouldDelete = YES;

    if ([UITextField instancesRespondToSelector:_cmd]) {
        BOOL (*keyboardInputShouldDelete)(id, SEL, UITextField *) = (BOOL (*)(id, SEL, UITextField *))[UITextField instanceMethodForSelector:_cmd];

        if (keyboardInputShouldDelete) {
            shouldDelete = keyboardInputShouldDelete(self, _cmd, textField);
        }
    }

    if (![textField.text length] && [[[UIDevice currentDevice] systemVersion] intValue] >= 8) {
        [self deleteBackward];
    }

    return shouldDelete;
}

@end

আপনি দ্রুত জন্য কোড লিখতে পারেন? আমি কিছু ত্রুটি পেয়েছি "প্রোটোকো ইউকেইনপুটকে রিডানড্যান্ট কনফার্মেন্স"
রাজ

4

হ্যাঁ, টেক্সটফিল্ডটি খালি থাকলে ব্যাকস্পেস সনাক্ত করতে নীচের পদ্ধতিটি ব্যবহার করুন।

ইউআইটিেক্সটফিল্ডডেলিগেট যুক্ত করা দরকার

yourTextField.delegate = স্ব (আবশ্যক)

সুইফট:

func keyboardInputShouldDelete(_ textField: UITextField) -> Bool { 
    return true
}

উদ্দেশ্য গ:

- (BOOL)keyboardInputShouldDelete:(UITextField *)textField { 
    return YES; 
}

5
এটি আমার জন্য কলও করে না। অন্যান্য সমস্ত প্রতিনিধি পদ্ধতি যখন কখন কোন ইভেন্টের জন্য ডাকা হয়।
হেমং

আপনাকে সাথী ধন্যবাদ .. আপনি এটি পেরেক দিয়েছিলেন। :)
এমএস।

@ ম্যাকডোনাল_11 আমি মনে করি আপনি টেক্সটফিল্ড.ডিলেগেট = টেক্সটফিল্ডের স্ব সেট করতে ভুলে গেছেন।
হিমাংশু পদিয়া

আমি সেট করেছি। অন্যান্য ইউআইটিেক্সটফিল্ডের প্রতিনিধি পদ্ধতিগুলি ভাল কাজ করছে। এই একা কাজ করছে না। আমি কি মিস করি ??
ম্যাকডোনাল_11

3

ব্যাকস্পেস সনাক্ত করার জন্য আমি যে সর্বোত্তম ব্যবহারটি পেয়েছি তা সনাক্ত করা হয় যখন ব্যবহারকারী কোনও ফাঁকা জায়গায় ব্যাকস্পেস টিপে থাকে UITextField। উদাহরণস্বরূপ, আপনি যদি মেল অ্যাপ্লিকেশনটিতে 'বুদ্বুদ্বিত' প্রাপক হয়ে থাকেন, আপনি যখন ব্যাকস্পেসে আঘাত করেন UITextField, এটি সর্বশেষ 'বুদবুদ' প্রাপককে নির্বাচন করে।

এটি জ্যাকব কারাবলোর উত্তরের অনুরূপভাবে করা যেতে পারে। কিন্তু জ্যাকব এর উত্তরে, UITextFieldআপনি ব্যাকস্পেসে আঘাত করার সময় যদি একটি চরিত্রটি বাকী থাকে তবে প্রতিনিধি বার্তাটি পাওয়ার সময়টি UITextFieldইতিমধ্যে খালি হয়ে যাবে, সুতরাং আপনি backspaceবেশিরভাগ একটি অক্ষর সহ কোনও পাঠ্য ক্ষেত্রে কার্যকরভাবে সনাক্ত করতে পারেন।

আসলে, আপনি যদি সনাক্ত করতে চান backspaceএকটি উপর UITextFieldঠিক শূন্য অক্ষর (খালি) সঙ্গে, তারপর আপনি বার্তা পাঠাতে উচিত delegateথেকে কল করার আগে super deleteBackward। উদাহরণ স্বরূপ:

#import "MyTextField.h"

//Text field that detects when backspace is hit with empty text
@implementation MyTextField

#pragma mark - UIKeyInput protocol
-(void)deleteBackward
{
  BOOL isTextFieldEmpty = (self.text.length == 0);
  if (isTextFieldEmpty) {
    if ([self.delegate 
         respondsToSelector:@selector(textFieldDidHitBackspaceWithEmptyText:)]) {

        [self.delegate textFieldDidHitBackspaceWithEmptyText:self];
        }
    }
    [super deleteBackward];
}
@end

এই জাতীয় পাঠ্য ক্ষেত্রের ইন্টারফেসটি এরকম কিছু দেখায়:

@protocol MyTextFieldDelegate;

@interface MyTextField : UITextField
@property(nonatomic, weak) id<MyTextFieldDelegate> delegate;
@end

@protocol MyTextFieldDelegate <UITextFieldDelegate>
@optional
-(void)textFieldDidHitBackspaceWithEmptyText:(MyTextField *)textField;
@end

2
এটি আইওএস 8 এ কাজ করার জন্য (যেখানে এই প্রতিনিধি পদ্ধতিটিকে কখনই ডাকা হতে পারে না এমন বাগ রয়েছে), দয়া করে এই উত্তরটি দেখুন: stackoverflow.com/a/25862878/893101 । Ios8 বাগ সম্পর্কে আরও বিশদ: devforums.apple.com/message/1009150#1009150
পিকেল

2

আইওএস 6-এ, ক্ষেত্রটি খালি থাকাকালীন ব্যাকস্পেস টিপে যখন ডিলিটব্যাকওয়ার্ড পদ্ধতিটি ইউআইটিেক্সটফিল্ডে কল করা হয়। সুতরাং আপনি ইউআইটিেক্সটফিল্ড সাবক্লাস করতে পারেন এবং আপনার নিজের ডিলেটব্যাকওয়ার্ড বাস্তবায়ন সরবরাহ করতে পারেন (সুপারকে অনুরোধ করাও))

আমি এখনও আইওএস 5 সমর্থন করছি যদিও আমার কাছে অ্যান্ড্রুয়ের উত্তর এবং এটির সংমিশ্রণ প্রয়োজন।


1

:) শুধু শিরোনামের জন্য "ব্যাকস্পেস শনাক্ত করুন", আমি কোথায় ব্যবহার UIKeyboardTypeNumberPad

আমি আজ রাতেও একই প্রশ্নের সাথে দেখা করেছি এবং এটি সন্ধান করার জন্য আমার কোডটি নিম্নলিখিত:

- (BOOL)textField:(UITextField *)textField 
        shouldChangeCharactersInRange:(NSRange)range 
        replacementString:(NSString *)string
{
    NSLog([NSString stringWithFormat:@"%d", [string length]]);
}

কারণ UIKeyboardTypeNumberPad, ব্যবহারকারী কেবল সংখ্যা বা ব্যাকস্পেস ইনপুট করতে পারেন, সুতরাং যখন স্ট্রিংয়ের দৈর্ঘ্য 0 হয়, এটি অবশ্যই ব্যাকস্পেস কী হতে হবে।

আশা করি উপরোক্তরা কিছু সাহায্য করবেন।


এটি কোনও কীবোর্ড টাইপের সাথে একই।
ma11 শেই 28

আমি আমার পাঠ্যক্ষেত্রে এই পদ্ধতিটি কীভাবে হুক করব?
ব্যবহারকারী230910

1

পাঠ্যক্ষেত্রে কী হবে তা প্রাক-কাঠামো চেষ্টা করার চেয়ে বা shouldChangeCharactersInRangeপদ্ধতিতে কোন বিশেষ চরিত্রটি প্রবেশ করানো হয়েছে তা নির্ধারণ করার পরিবর্তে আমি নিম্নলিখিতটি করার পরামর্শ দিচ্ছি:

[self performSelector:@selector(manageSearchResultsDisplay) 
           withObject:nil 
           afterDelay:0];

বর্তমান অপারেশন সমাপ্ত হওয়ার পরে এটি আপনাকে সরাসরি কোনও পদ্ধতিতে কল করার অনুমতি দেয়। এই সম্পর্কে দুর্দান্ত যা হ'ল এটি সম্পূর্ণ হওয়ার সাথে সাথে পরিবর্তিত মানটি ইতিমধ্যে এর মধ্যে চলে আসবে UITextField। এই মুহুর্তে, আপনি কেবল এটির দৈর্ঘ্য পরীক্ষা করতে পারেন এবং / বা যা আছে তার উপর ভিত্তি করে যাচাই করতে পারেন।


1

সাবক্লাসিং ইউআইটিেক্সটফিল্ড আইওএস 8.3 এ আমার জন্য কাজ করে না, মুছুনব্যাকওয়ার্ডকে কখনও কল করা হয়নি।

আমি যে সমাধানটি ব্যবহার করেছি তা এখানে সমস্ত আইওএস 8 সংস্করণে কাজ করে এবং অন্যান্য আইওএস সংস্করণেও কাজ করা উচিত

for textField in textFields {
            textField.text = " "
}

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        if string == "" && textField.text == " "   {
            // Do stuff here
            return false
        }
        return true
}

1

.H ফাইলটিতে ইউআইকেইআইপুট প্রতিনিধি যুক্ত করুন

- (BOOL)keyboardInputShouldDelete:(UITextField *)textField {

if ([textField isEqual:_txtFirstDigit]) {

}else if([textField isEqual:_txtSecondDigit]) {
    [_txtFirstDigit becomeFirstResponder];

}else if([textField isEqual:_txtThirdDigit]) {
    [_txtSecondDigit becomeFirstResponder];

}else if([textField isEqual:_txtFourthDigit]) {
    [_txtThirdDigit becomeFirstResponder];
}
return YES;
}   

ফর্ম্যাটিং উন্নত


1

আমি গৌণ উন্নতির সাথে একই সমাধানটি প্রয়োগ করেছি যা আমাকে বলবে যে ব্যবহারকারী ব্যাকস্পেসটি ট্যাপ করার সময় পাঠ্যের ক্ষেত্রে যদি কোনও মান থাকে। এটি আমার ক্ষেত্রে কার্যকর যখন ব্যাকস্পেস টিপে যখন টেক্সট ক্ষেত্রটি ফাঁকা থাকে কেবল তখনই আমি অন্য একটি পাঠ্য ক্ষেত্রে ফোকাস করা উচিত।

protocol MyTextFieldDelegate : UITextFieldDelegate {
    func textFieldDidDelete(textField: MyTextField, hasValue: Bool)
}

override func deleteBackward() {
    let currentText = self.text ?? ""
    super.deleteBackward()
    let hasValue = currentText.isEmpty ? false : true
    if let delegate = self.delegate as? MyTextFieldDelegate {
        delegate.textFieldDidDelete(textField: self, hasValue: hasValue)
    }
}

1

সর্বাধিক জনপ্রিয় উত্তরটিতে একটি জিনিস অনুপস্থিত - পাঠ্য ক্ষেত্রটি খালি ছিল কিনা তা সনাক্ত করার ক্ষমতা।

এটি হ'ল আপনি যখন টেক্সটফিল্ড সাবক্লাসের ডিলিটব্যাকওয়ার্ডস () পদ্ধতিটি ওভাররাইড করবেন তখন আপনি এখনও জানেন না যে পাঠ্য ক্ষেত্রটি ইতিমধ্যে খালি ছিল। (ডিলিটব্যাকওয়ার্ডের আগে এবং পরে উভয়ই) textField.text!একটি খালি স্ট্রিং:"" :)

মুছে ফেলার পূর্বে শূন্যতার জন্য একটি চেক সহ আমার উন্নতি এখানে।

1. একটি প্রতিনিধি প্রোটোকল তৈরি করুন যা UITextFieldDelegate প্রসারিত করে

protocol MyTextFieldDelegate: UITextFieldDelegate {
    func textField(_ textField: UITextField, didDeleteBackwardAnd wasEmpty: Bool)
}

2. সাবক্লাস ইউআইটিেক্সটফিল্ড

class MyTextField: UITextField {
    override func deleteBackward() {
        // see if text was empty
        let wasEmpty = text == nil || text! == ""

        // then perform normal behavior
        super.deleteBackward()

        // now, notify delegate (if existent)
        (delegate as? MyTextFieldDelegate)?.textField(self, didDeleteBackwardAnd: wasEmpty)
    }
}

৩. আপনার নতুন প্রতিনিধি প্রোটোকল প্রয়োগ করুন

extension MyViewController: MyTextFieldDelegate {
    func textField(_ textField: UITextField, didDeleteBackwardAnd wasEmpty: Bool) {
        if wasEmpty {
            // do what you want here...
        }
    }
}

1

সুইফ্ট 5.1 এর জন্য একক সংখ্যার সাথে পাঠ্যক্ষেত্রের জন্য বিস্তৃত হ্যান্ডলার :

  • ধরে নিই যে আপনার পাঠ্যফিল্ডগুলির আউটলেট সংগ্রহ রয়েছে (সংযুক্ত প্রতিনিধিদের সাথেও)

1 পদক্ষেপ

protocol MyTextFieldDelegate: class {
    func textField(_ textField: UITextField, didDeleteBackwardAnd wasEmpty: Bool) 
}

final class MyTextField: UITextField {

    weak var myDelegate: MyTextFieldDelegate?

    override func deleteBackward() {
        let wasEmpty = text == nil || text == ""

        // then perform normal behavior
        super.deleteBackward()

        // now, notify delegate (if existent)
        (delegate as? MyTextFieldDelegate)?.textField(self, didDeleteBackwardAnd: wasEmpty)
    }
}

2 পদক্ষেপ

final class ViewController: UIViewController {

    @IBOutlet private var textFields: [MyTextField]!

    override func viewDidLoad() {
        super.viewDidLoad()
        textFields.forEach {
            $0.delegate = self
            $0.myDelegate = self
        }
    }
}

3 পদক্ষেপ

extension ViewController: UITextFieldDelegate, MyTextFieldDelegate {
    func textFieldHasChanged(with text: String, _ tag: Int, for textField: UITextField) {
        textField.text = text

        if let someTextField = (textFields.filter { $0.tag == tag }).first {
            someTextField.becomeFirstResponder()
        } else {
            view.endEditing(true)
        }
    }

    func textField(_ textField: UITextField, didDeleteBackwardAnd wasEmpty: Bool) {
        // If the user was pressing backward and the value was empty, go to previous textField
        textFieldHasChanged(with: "", textField.tag - 1, for: textField)
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        // Restrict to only digits
        let aSet = NSCharacterSet(charactersIn: "0123456789").inverted
        let compSepByCharInSet = string.components(separatedBy: aSet)
        let numberFiltered = compSepByCharInSet.joined(separator: "")

        guard string == numberFiltered, let text = textField.text else { return false }

        if text.count >= 1 && string.isEmpty {
            // If the user is deleting the value
            textFieldHasChanged(with: "", textField.tag - 1, for: textField)
        } else {
            textFieldHasChanged(with: string, textField.tag + 1, for: textField)
        }

        return false
    }
}

0

এখানে @ অ্যান্ড্রু আইডিয়া ভিত্তিক আমার সমাধান:

কোথাও, উদাহরণস্বরূপ ViewDidLoad এ

        textField.delegate = self
        textField.addTarget(self, action: #selector(valueChanged(_:)), for: .editingDidBegin)

এবং তারপর

    @objc func valueChanged(_ textField: UITextField) {
        textField.text = "\u{200B}"
    }

    override func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        textField.text = string
        if string == "" {
            //backpaspace pressed 
        }

0

এটি খালি কিনা তা দেখতে আপনি পাঠ্য দর্শন / ক্ষেত্রের পাঠ্যটি পরীক্ষা করে দেখতে পারেন এবং প্রতিস্থাপন পাঠ্যটি খালি চেঞ্জটেক্সটইন প্রতিনিধি পদ্ধতিতে খালি কিনা তা নিশ্চিত করতে পারেন।

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if (textView.text == "" && text == "") {
        print("Backspace on empty text field.")
    }
    return true
}

-2

এটার মতো কিছু:

- (BOOL)textField:(UITextField *)textField 
        shouldChangeCharactersInRange:(NSRange)range 
        replacementString:(NSString *)string       
{  
    if (![text hash] && ![textField.text length])  
        [self backspaceInEmptyTextField];  
}

অবশ্যই হ্যাশটি একটি চরিত্রের স্ট্রিংয়ের জন্য।


-2

টেক্সটফিল্ড ডেলিগেট পদ্ধতিটি ব্যবহার করে:

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

ইভেন্টটি মোছার জন্য উপরের পদ্ধতিতে নিম্নলিখিত কোডটি যুক্ত করুন

if(textField == YourTextField)
{
    if ([string length] == 0 && range.length > 0)
    {
        // Your Code after deletion of character
    }
}


-3
+ (BOOL)detectBackspaceOnly:(NSString *)string
{
    for(int i=0 ; i<string.length ; i++){
        unichar caract = [string characterAtIndex:i];
        if(caract != ' ' && caract != '\n')
            return NO;
    }

    return YES;
}

2
হয়তো একটু ব্যাখ্যা দিলে কোথায় রাখব?
অ্যালেক্স সিও

-4

ইন UITextViewDelegate:

- (BOOL)               textView:(UITextView *)textView 
        shouldChangeTextInRange:(NSRange)range 
                replacementText:(NSString *)text
{
    if(text isEqualToString:@"");
    {
        NSLog(@"press backspace.");
    }
}

এটা আমার জন্য ঠিক কাজ করে।

চীনা সরলীকৃত পিনয়িন এবং চীনা হস্তাক্ষর ইনপুটটির জন্য আপডেট করুন:

- (BOOL)               textView:(UITextView *)textView 
        shouldChangeTextInRange:(NSRange)range 
                replacementText:(NSString *)text
{
    if (range.length > 0 && [text isEqualToString:@""]) {
        NSLog(@"press Backspace.");
    }
    return YES;
}

নথির ভিত্তিতে বলা হয়েছে:

"যদি ব্যবহারকারীটি টিপায় deleteKey, ব্যাপ্তির দৈর্ঘ্য 1 এবং একটি খালি স্ট্রিং অবজেক্ট সেই একক অক্ষরকে প্রতিস্থাপন করে।"


1
এই প্রশ্নটি সম্পর্কে UITextField, না UITextView
ma11 শেই 28
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.