我已经将UITextField子类化,并实现了UIKeyInput协议的deleteBackward方法来检测被按下的退格.这适用于iOS 7,但不适用于iOS 8.
当我按退格键时,不再在UITextField上调用deleteBackward.
我已经检查了文档和发行说明,没有指出可能发生这种情况的原因.有什么指针吗?
我正在寻找关于如何捕获退格事件的解决方案,大多数Stack Overflow答案都在Objective-C中,但我需要使用Swift语言.
首先,我为UITextField设置了委托并将其设置为self
self.textField.delegate = self;
Run Code Online (Sandbox Code Playgroud)
然后我知道使用shouldChangeCharactersInRange委托方法来检测是否按下退格是所有代码都在Objective-C中.我需要在Swift中使用以下方法,如下所示.
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
const char * _char = [string cStringUsingEncoding:NSUTF8StringEncoding];
int isBackSpace = strcmp(_char, "\b");
if (isBackSpace == -8) {
// NSLog(@"Backspace was pressed");
}
return YES;
}
Run Code Online (Sandbox Code Playgroud) 如何检测按下的退格按钮UIKeyboard?

谢谢
编辑:是否有任何键盘委托返回按键值?
当UITextField什么都不包含时,按下键盘的删除键不会调用任何UITextFieldDelegate的方法.
我该如何检测它?
编辑:似乎没有简单的方法来做到这一点.我能找到的最有用的链接是:
简而言之,我的解决方案是在文本字段的开头放置一个永久的SPACE.并进行其他nesessary更改(textFieldShouldReturn:,textField:shouldChangeCharactersInRange:replacementString:,等).
可能重复:
检测UITextField中的退格
我想检测键盘上按下退格键的时间,即使a UITextField为空.
我试图使用ShouldChangeCharachtersInRange,但是当调用退格并且文本为空时,它不会被调用.
我怎么解决这个问题?
为了检测Backspace,我已经覆盖了DeleteBackward方法(应该适用于iOS5 +)
var input = new BackspaceTextField(RectangleF.Empty);
etc
input.BecomeFirstResponder();
Run Code Online (Sandbox Code Playgroud)
这是代码
public sealed class BackspaceTextField : UITextField
{
public BackspaceTextField(RectangleF frame) : base(frame)
{
}
public override void DeleteBackward ()
{
Console.WriteLine ("DeleteBackward");
}
}
Run Code Online (Sandbox Code Playgroud)
当我按"Backspace"按钮时没有任何反应.我希望应该出现"DeleteBackward"消息
环境:iOS8,xamarin
编辑:0
关于objective-c的类似问题:检测UITextField中的退格
我做了额外的检查.DeleteBackward是来自UIKeyInput协议的方法,所以我检查insertText方法,这个方法可以正常工作.
public override void InsertText (string text)
{
base.InsertText(text);
}
Run Code Online (Sandbox Code Playgroud)
我已经检查deleteBackward了objective-c,它也很完美.
您对如何在iOS8中的UITextField中检测退格有任何想法吗?
你能澄清为什么DeleteBackward没有调用这个方法吗?
编辑:1
我已经向Xamarin的论坛提交了同样的问题.看起来像iOS8 + xamarin中的一个错误,因为在iOS 7.1中可以正常工作.
这是一个错误.这是细节
func textFieldDidBeginEditing(textField: UITextField) {
scrlView.setContentOffset(CGPointMake(0, textField.frame.origin.y-70), animated: true)
if(textField == firstDigit){
textField.becomeFirstResponder()
secondDigit.resignFirstResponder()
}
else if(textField == secondDigit){
textField.becomeFirstResponder()
thirdDigit.resignFirstResponder()
}
else if(textField == thirdDigit){
//textField.becomeFirstResponder()
fourthDigit.becomeFirstResponder()
}
Run Code Online (Sandbox Code Playgroud)
我使用四个文本字段进行OTP输入,其中一次只能输入一个数字.输入数字后,我需要将光标自动移动到下一个文本字段.
我正在使用文本字段委托方法"shouldChangeCharactersInRange",我想知道是否有任何方法可以判断用户是否正在删除字符或键入字符?谁知道?谢谢.
为了尝试在UITextField中检测退格,我尝试了子类化UITextField和重写-[UIKeyInput deleteBackward],但它永远不会被调用.所以,我怀疑UITextField碎冰鸡尾酒deleteBackward另一个方法名.
使用Objective-C运行时,如何确定哪个方法名称deleteBackward已被调整为?然后,我如何更改实现,以便在空键时按下删除键时UITextField调用[self.delegate textField:self shouldChangeCharactersInRange:NSMakeRange(0, 0) replacementString:@""].
此外,这种元编程会让我的应用程序被App Store拒绝吗?
注意!这个问题不是这个或这个问题的重复!这是一个让事情变得更加清晰的新问题.
所以我已经按照上面帖子的所有说明进行操作,并且UITextField每次用户点击返回按钮时,我都会将其变为空白并移动到新位置.此外,我跟踪textView的输入,并在TextView的位置创建该文本的标签,如下所示:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if (textField.text.length > 5) {
CGRect labelFrame = CGRectMake(textField.frame.origin.x, textField.frame.origin.y, 0, 0);
UILabel *label = [[UILabel alloc] initWithFrame: labelFrame];
label.font = [UIFont fontWithName:@"HelveticaNeue" size:14];
[label setText:textField.text];
[label setTextColor: [BSFunctions getColorFromHex:@"3f3f3f"]];
label.backgroundColor =[UIColor lightGrayColor];
[label sizeToFit];
[labelsArray addObject:label];
[self.view addSubview: label];
CGRect newTextFieldFrame = CGRectMake(labelFrame.origin.x + label.frame.size.width + 5, labelFrame.origin.y, 320, 30);
NSLog(@"Rect is %@", NSStringFromCGRect(newTextFieldFrame));
textField.frame = newTextFieldFrame;
textField.text = @"\u200B";
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
我设置文本UITextField的文字是 …
我需要能够创建一个String "\b".但是当我尝试时,Xcode会抛出编译时错误:文字中的转义序列无效.我不明白为什么,但"\r"工作得很好.如果我把"\\b"那就是实际存储在String中的东西,这不是我需要的东西 - 我只需要一个反斜杠.对我来说,这似乎是一个Swift古怪,因为它在Objective-C中运行得很好.
let str = "\b" //Invalid escape sequence in literal
NSString *str = @"\b"; //works great
Run Code Online (Sandbox Code Playgroud)
我需要生成这个字符串,因为这"\b"是检测用户何时使用"删除"的唯一方法UIKeyCommand:
let command = UIKeyCommand(input: "\b", modifierFlags: nil, action: "didHitDelete:")
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
编辑:它真的不想生成一个只有的字符串"\b",这不起作用 - 它保持原始值:
var delKey = "\rb"
delKey = delKey.stringByReplacingOccurrencesOfString("r", withString: "", options: .LiteralSearch, range: nil)
Run Code Online (Sandbox Code Playgroud) 我有一个OTP屏幕,我必须在4个Diff TextFields中输入4位数密码的OTP,场景如下:
我已经管理了高达70%的工作,但只有当用户输入所有textField时,后退空间才有效.我正在粘贴我的代码.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
// This allows numeric text only, but also backspace for deletes
if (string.length > 0 && ![[NSScanner scannerWithString:string] scanInt:NULL])
return NO;
NSUInteger oldLength = [textField.text length];
NSUInteger replacementLength = [string length];
NSUInteger rangeLength = range.length;
NSUInteger newLength = oldLength - rangeLength + replacementLength;
// This 'tabs' to next field when entering digits
if (newLength == 1) {
if (textField == _pin1)
{
[self performSelector:@selector(setNextResponder:) withObject:_pin2 afterDelay:0];
}
else …Run Code Online (Sandbox Code Playgroud) ios ×9
uitextfield ×7
iphone ×5
objective-c ×5
swift ×3
cocoa-touch ×2
ios8 ×2
escaping ×1
string ×1
uikeyboard ×1
uikeyinput ×1
uikit ×1
xamarin ×1
xamarin.ios ×1
xcode ×1