빈 UITextField에서 백 스페이스 감지


126

비어 있는 iPhone 키보드에서 Backspace/ Delete키를 누를 때를 감지하는 방법 UITextField이 있습니까? 가 비어있는 Backspace경우에만 눌렀 는지 알고 싶습니다 UITextField.


주석에서 @Alex Reynolds의 제안에 따라 텍스트 필드를 만드는 동안 다음 코드를 추가했습니다.

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

이 알림을 받았지만 ( handleTextFieldChanged함수 호출) Backspace빈 필드에서 키를 눌러도 여전히 알림이 표시 되지 않습니다 . 어떤 아이디어?


이 질문과 관련하여 약간의 혼동이있는 것 같습니다. Backspace키를 누를 때 알림을 받고 싶습니다 . 그게 다야. 그러나 솔루션 UITextField이 이미 비어있는 경우에도 작동해야합니다 .


"키보드가 비어있는 경우에만"이 아니라 "UITextField가 비어있는 경우에만"을 의미한다고 생각하십니까?
Steve Harrison

@Steve Harrison : 감사합니다. 업데이트했습니다.
marcc

나는 비슷한 것을하려고 노력하고 있는데, 그때 어떤 해결책을 얻었습니까? 내가하고있는 일은 스크롤보기의 텍스트 필드입니다. 텍스트를 입력하면 제안 사항이 표시되며 클릭하면 텍스트 필드 왼쪽에 레이블 객체가 배치됩니다. 미리 감사드립니다 : D
Dough

런타임 속임수를 사용하여 빈 UITextField를위한 2011/11 솔루션 : bjhomer.blogspot.com/2011/11/…
Jano

4
너무 사소한 일을 위해 엄청나게 길다. 어렵지 않아야합니다.
Adam Waite

답변:


36

이것은 오래 걸릴 수 있지만 작동 할 수 있습니다. 텍스트 필드의 텍스트를 너비가 0 인 공백 문자로 설정하십시오 \u200B. 비어있는 텍스트 필드에서 백 스페이스를 누르면 실제로 공백이 삭제됩니다. 그런 다음 공간을 다시 삽입하면됩니다.

사용자가 캐럿을 공간의 왼쪽으로 이동하면 작동하지 않을 수 있습니다.


3
@Andrew, 이것이 내가 결정한 접근법입니다. 약간의 코드가 필요했지만 확실히 효과적입니다. 내가 뭔가 잘못하고 있다고 알려주는 대신 도움을 주셔서 감사합니다.
marcc

2
이 기술은 iPhone> 3.1.3에서 작동하지만 해킹되어 향후 버전에서 작동하지 않을 수 있습니다 . iPhone / iOS에서 키보드 키 삭제를 감지하는 방법에 대한 더 깨끗하고 안정적인 솔루션을 찾았습니다 .
ma11hew28

6
사용자가 커서를 공백의 왼쪽으로 이동하면 삭제가 감지되지 않음을 확인할 수 있습니다. 그것을 고치는 방법을 알아낼 수 있다면 , 텍스트가 string과 같을 때 for 와 action 을 서브 클래스 화 UITextField하고 구현 해야 합니다 . canPerformAction:withSender:return NOselect:selectAll:@"\u200B"
ma11hew28

2
문제는 보안 테스트 필드에서 작동하지 않는다는 것입니다. 그것을 처리하는 방법에 대한 아이디어가 있습니까?
Kyle Clegg

7
죄송하지만이 아이디어는 나쁩니다. 그것은 믿을 수 없을 정도로 해키이며 30 개 정도의 공감대가 허용되는 대답이되어서는 안됩니다. 다른 주석 작성자가 언급했듯이 UITextField를 대신 서브 클래스 화합니다.
Brian Sachetta 2016 년

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

}

목표 -C :


서브 클래스 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 myDelegateself다음 과 같이 설정하십시오 .

//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
이것이 가장 좋은 해결책입니다. 대답은 해킹입니다. 목표 C는 하위 분류를 기반으로하며이 솔루션은이를 올바르게 사용하여 문제를 해결합니다.
TJ

ViewController 텍스트 필드의 대리자를 UITextField대신에 하위 클래스로 설정하면 클래스의 기존 대리자 메서드는 어떻게됩니까UIViewController
rohan-patel

4
이 분명히 애플 버그처럼 보이는 때문에 지금 iOS8의에서 작동하지 않습니다 devforums.apple.com/message/1045312#1045312
chug2k

1
내 대답에서와 같이 ios8 버그에 대한 해결 방법을 사용했으며 효과가있었습니다. 솔루션을 찾는 사람들에게 유용 할 수 있습니다.
furkan3ayraktar

1
deleteBackward()당신이 경우 호출되지 않습니다 return falsetextField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
igrrik

41

업데이트 : 재정의하는 예제는 JacobCaraballo의 답변 을 참조하십시오 -[UITextField deleteBackward].

체크 아웃 UITextInput, 특히 삭제 키를 누를 때 항상 호출 UIKeyInput되는 deleteBackward대리자 메서드 가 있습니다. 간단한 작업을 수행하는 경우 SimpleTextInput 및이 iPhone UIKeyInput Example 과 같이 서브 클래 싱 하고 프로토콜을 준수하도록 고려할 수 있습니다 . 참고 : 및 관련 항목 (포함 )은 iOS 3.2 이상에서만 사용할 수 있습니다.UILabelUIKeyInputUITextInputUIKeyInput


2
이것이 정답입니다. UITextField의 빠른 하위 클래스를 사용하면 해킹이 아니며 매우 간단합니다.
Sam

아래에서 야곱의 대답을 발견했습니다. 이에 대한 자세한 예를 제공합니다.
Sam

텍스트 필드가 비어 있으면 백 스페이스를 누르면이 메소드가 호출되지 않습니다.
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

마지막으로 텍스트 필드의 사용자 정의 클래스 속성을 "MyTextField"로 변경하십시오.


5
이것이 정답입니다. 깨끗하고 실제로 질문에 대답합니다.
Ryan Romanchuk

1
그것은 질문에 대답하지 않습니다 ... iOS 6.0 이상을 대상으로하는 한. iOS 5에서 불행히도 deleteBackward는 서브 클래스에서 호출되지 않았습니다.
BJ 호머

2
BJ Homer, 기기의 93 %가 iOS 6을 사용하므로 iOS 5를 타겟팅하지 않는 것은 일반적으로 그리 큰 문제가 아닙니다.
조나단.

2
나는 이것을 찾을 수있을 정도로 아래로 스크롤을 계속해서 기쁘다. IOS 7에서이 작업을 수행하는 올바른 방법은 100 %입니다.
MusiGenesis

나는이 질문에 대한 많은 다른 답변을 방금 해결했으며, 빈 필드에서 백 스페이스 키를 누르는 상황을 다루는 사람은 거의 없습니다. 그러나 이것은 완벽하고 정말 깨끗한 방법입니다.
Christopher Hannah

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

고마워요,이 방법이 사과에 의해 권장되거나 해킹 된 것을 알 수 있습니다. 텍스트 필드에 대해서는 문서화되지 않은 것 같습니다.
kalpesh jetani 2016 년

textView로 나를 위해 일했습니다. 공유해 주셔서 감사합니다;)
Edouard Barbier

텍스트 필드가 비어 있고 백 스페이스를 클릭하면 나를 위해 일했습니다.
Ramakrishna

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
배영이 '\ b'로 설정되지 않았습니다. 그러나 신중하게 디버깅하면 '\ 0'이 표시됩니다. 그래서 strcmp 메소드에서 두 값이 같은 결과 0을 얻습니다. const char * stoke = [텍스트 cStringUsingEncoding : NSASCIIStringEncoding]; const char * backstroke = "\ 0"; // 이것은 \ b-> "\ x08"와 같습니다. strcmp (배영, 스토크);
Yoon Lee

또한 strcmp (s1, s2)의 정의에 따라 s1 == s2 인 경우 0을 반환하고> 0 s1이 사 전적으로 s2보다 큰 경우 그 반대도 마찬가지입니다.
Yoon Lee

이것이 어떻게 작동하는지 이해할 수 없습니까? @ YoonLee : 당신 strcmp은 어느 쪽도 반환 한다고 말하지 -1, 0, or 1않습니까? 그건 내 이해였습니다.
chug2k

1
textview에서 텍스트가없는 경우에도 항상 백 스페이스를 감지합니다. UITextField가 다릅니다
LolaRun

2
UITextViewDelegate방법은 아닙니다 UITextFieldDelegate.
pkamb

11

시도 delegate

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

그런 다음 range.length == 1어떤 backspace것이 맞았 는지 확인하십시오 .


8
그러나 field가 비어 있지 않은 경우에만 호출됩니다. 원래 질문에 유의하십시오. :)
Eric Goldberg

이를 위해 UITextView를 사용하십시오.
Oleg

11

아래 코드를 사용하면 텍스트 필드가 비어 있어도 키보드 삭제 키를 감지하는 데 도움이됩니다.

목표 C :

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

빠른 :

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

Tx-내가 필요한 것. 그러나 어디에 기록되어 있습니까?
Andy Weinstein

9

Niklas Alvaeus의 답변이 비슷한 문제를 해결하는 데 도움이되었습니다.

특정 문자 세트로 항목을 제한했지만 백 스페이스는 무시하고있었습니다. 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);
    }   
 }

이 메서드는 반환 값으로 문자열이 아닌 부울을 예상합니다.
Pascalius

4

Jacob의 답변에 문제가있는 사람들을 위해 다음과 같이 텍스트 필드 하위 클래스를 구현했으며 훌륭하게 작동합니다!

#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

신속하게 코드를 작성할 수 있습니까? 나는 몇 가지 오류 "protoco uikeyinput에 대한 중복 confirmance"있어요
라즈 Aggrawal

4

예, textField가 비어있을 때 아래 방법을 사용하여 백 스페이스를 감지하십시오.

UITextFieldDelegate 를 추가해야합니다

yourTextField.delegate = 자체 (필수)

빠른:

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

목표 C :

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

5
이것은 나를 요구하지도 않습니다. 다른 모든 대리자 메서드는 이벤트 발생시 및시기에 호출됩니다.
Hemang

당신에게 친구 감사합니다. 당신은 그것을 못 박았다. :)
MS.

@ McDonal_11 textfield.delegate = self of textfield를 설정하는 것을 잊었다 고 생각합니다.
Himanshu padia

나는 설정했다. 다른 UITextField의 대리자 메서드가 제대로 작동합니다. 이것만으로는 작동하지 않습니다. 내가 뭘 그리워 ??
McDonal_

3

백 스페이스를 감지하기 위해 내가 찾은 가장 좋은 용도는 사용자가 백 스페이스를 빈 공간으로 누른 시점을 감지하는 것 UITextField입니다. 예를 들어, 메일 앱에 '버블 링 된'수신자가있는 경우의에서 백 스페이스를 칠 때 UITextField마지막 '버블 링 된'수신자를 선택합니다.

이것은 Jacob Caraballo의 대답과 비슷한 방식으로 수행 할 수 있습니다. 그러나 Jacob의 대답에서 UITextField백 스페이스를 칠 때 한 문자가 남았을 때 대리자 메시지가 수신 될 때까지는 UITextField이미 비어 있으므로 backspace최대 하나의 문자가있는 텍스트 필드를 효과적으로 감지 합니다.

당신이 감지하려는 경우 사실, backspaceA의 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
iOS8 에서이 기능을 사용하려면 (이 델리게이트 메소드를 호출하지 않는 버그가있는 경우) stackoverflow.com/a/25862878/893101을 참조하십시오 . ios8 버그에 대한 자세한 내용 : devforums.apple.com/message/1009150#1009150
pIkEL

2

iOS 6에서는 필드가 비어있을 때를 포함하여 백 스페이스를 누를 때 UITextField에서 deleteBackward 메소드가 호출됩니다. 따라서 UITextField를 서브 클래 싱하고 고유 한 deleteBackward 구현을 제공 할 수 있습니다 (수퍼 호출).

나는 여전히 iOS 5를 지원하고 있으므로 Andrew의 답변과 이것의 조합이 필요합니다.


1

:) 제목 "Detect backspace"에 대해서만 사용 UIKeyboardTypeNumberPad합니다.

나는 또한 오늘 밤 같은 질문을 만났으며 다음은 그것을 찾는 코드입니다.

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

을 사용 UIKeyboardTypeNumberPad하면 사용자는 숫자 또는 백 스페이스 만 입력 할 수 있으므로 문자열 길이가 0이면 백 스페이스 키 여야합니다.

위의 도움이되기를 바랍니다.


모든 키보드 유형과 동일합니다.
ma11hew28

이 방법을 텍스트 필드에 어떻게 연결합니까?
user230910

1

텍스트 필드에 무엇이 있을지 미리 구성하거나 shouldChangeCharactersInRange메소드 에 입력 된 특수 문자를 파악하기보다는 다음을 수행하는 것이 좋습니다.

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

현재 작업이 완료된 직후에 메소드를 호출 할 수 있습니다. 멋진 점은 완료 될 때 수정 된 값이 이미에 있다는 것입니다 UITextField. 이 시점에서 길이를 확인하거나 존재하는 내용에 따라 유효성을 검사 할 수 있습니다.


1

iOS 8.3에서 UITextField 서브 클래 싱이 작동하지 않아 deleteBackward가 호출되지 않았습니다.

여기 내가 사용한 솔루션이 있으며 모든 iOS 8 버전에서 작동하며 다른 iOS 버전에서도 작동해야합니다.

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 파일에서 UIKeyInput 델리게이트 추가

- (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 서브 클래스의 deleteBackwards () 메소드를 대체 할 때 여전히 텍스트 필드가 비어 있는지 알 수 없습니다. deleteBackwards () 전후 textField.text!에 빈 문자열이 있습니다."" )

삭제하기 전에 공허함을 점검하여 개선 사항이 있습니다.

1. UITextFieldDelegate를 확장하는 델리게이트 프로토콜을 만듭니다.

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

2. 서브 클래스 UITextField

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

3. 새로운 델리게이트 프로토콜 구현

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

1

Swift 5.1의 경우 한 자리 수의 텍스트 필드에 대한 포괄적 인 처리기 :

  • textFields의 콘센트 컬렉션이 있다고 가정합니다 (연결된 대리자 포함)

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

@andrew 아이디어를 기반으로 한 내 솔루션 :

어딘가에, 예를 들어 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

텍스트보기 / 필드의 텍스트가 비어 있는지 확인하고 shouldChangeTextIn delegate 메소드에서 대체 텍스트도 비어 있는지 확인할 수 있습니다.

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

TextField Delegate 메서드 사용 :

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

여기서 간단하게 유지하려면 확인해야 할 유일한 조건입니다.

     if (range.length==1)

-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
어쩌면이 부분을 넣을 약간의 설명이 있습니까?
Alex Cio

-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.
ma11hew28
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.