[ios] 빈 UITextField에서 백 스페이스 감지

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


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

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

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


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



답변

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

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


답변

스위프트 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");
}


답변

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

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


답변

다음과 같은 코드 :

@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”로 변경하십시오.


답변

신속한 구현 :

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


답변

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. 그러나 올바른 일;)


답변

시도 delegate

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

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