[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
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");
}
답변
업데이트 : 재정의하는 예제는 JacobCaraballo의 답변 을 참조하십시오 -[UITextField deleteBackward]
.
체크 아웃 UITextInput
, 특히 삭제 키를 누를 때 항상 호출 UIKeyInput
되는 deleteBackward
대리자 메서드 가 있습니다. 간단한 작업을 수행하는 경우 SimpleTextInput 및이 iPhone UIKeyInput Example 과 같이 서브 클래 싱 하고 프로토콜을 준수하도록 고려할 수 있습니다 . 참고 : 및 관련 항목 (포함 )은 iOS 3.2 이상에서만 사용할 수 있습니다.UILabel
UIKeyInput
UITextInput
UIKeyInput
답변
다음과 같은 코드 :
@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
것이 맞았 는지 확인하십시오 .