var input = new BackspaceTextField(RectangleF.Empty); etc input.BecomeFirstResponder();
这是代码
public sealed class BackspaceTextField : UITextField { public BackspaceTextField(RectangleF frame) : base(frame) { } public override void DeleteBackward () { Console.WriteLine ("DeleteBackward"); } }
当我按“退格”按钮没有任何反应.我希望出现“DeleteBackward”消息
环境:iOS8,xamarin
编辑:0
Objective-C类似的问题:Detect backspace in UITextField
我做了额外的检查. DeleteBackwardis方法从UIKeyInput协议,所以我已经检查了insertText方法,这个方法是有效的.
public override void InsertText (string text) { base.InsertText(text); }
我在目标c上检查了deleteBackward,它的工作原理很好.
你有什么想法如何检测在iOS8的UITextField的空格?
编辑:1
我向Xamarin的forum提交了同样的问题.看起来像iOS8 xamarin中的一个错误,因为在iOS 7.1中,它们的作品是有害的.
这是一个bug.这是details
解决方法
这个代码稍微在私有API的红线之前,但你应该没有问题使用它.我的应用程序与此代码在应用商店.
- (BOOL)keyboardInputShouldDelete:(UITextField *)textField { BOOL shouldDelete = YES; if ([UITextField instancesRespondToSelector:_cmd]) { BOOL (*keyboardInputShouldDelete)(id,SEL,UITextField *) = (BOOL (*)(id,UITextField *))[UITextField instanceMethodForSelector:_cmd]; if (keyboardInputShouldDelete) { shouldDelete = keyboardInputShouldDelete(self,_cmd,textField); } } BOOL isIos8 = ([[[UIDevice currentDevice] systemVersion] intValue] == 8); BOOL isLessThanIos8_3 = ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.3f); if (![textField.text length] && isIos8 && isLessThanIos8_3) { [self deleteBackward]; } return shouldDelete; }
要解释一下,正在调用super的这种方法的实现,以避免丢失继承的代码.如果没有文字,并且iOS版本在8-8.2之间,将要调用-deleteBackward.
编辑:1/28/15
对您的子类UITextField的-deleteBackward方法进行子类化也可能是有帮助的.这修复了一些有条件的bug.一个是使用自定义键盘.这是一个方法的例子.
- (void)deleteBackward { BOOL shouldDismiss = [self.text length] == 0; [super deleteBackward]; if (shouldDismiss) { if ([self.delegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)]) { [self.delegate textField:self shouldChangeCharactersInRange:NSMakeRange(0,0) replacementString:@""]; } } }
编辑:答案翻译为Xamarin,因为原来的问题问Xamarin.
[Preserve] [Export("keyboardInputShouldDelete:")] private bool KeyboardInputShouldDelete(UITextField textField) { var shouldDelete = true; if(RespondsToSelector(new Selector("_cmd"))) { //Call base class shouldDelete = Messaging.bool_objc_msgSend_IntPtr(Handle,Selector.GetHandle("_cmd"),textField.Handle); } //ios8 "bug": always call DeleteBackward even if the field is empty if(Utils.IsIos8) { DeleteBackward(); return false; } return shouldDelete; }
在ios 7.1和8.1上验证
编辑:4/14/15
从iOS 8.3起,这个问题已经解决了. Objective-C代码已更新以反映更改.
编辑:7/24/15
正如@nischalhada所言,状态存在文本字段-textField:shouldChangeCharactersInRange:replacementString:被调用两次.使用自定义键盘时,iOS> = 8.3时会出现此问题.我的解决方案不是很理想,但它的工作,我不知道是否有任何其他方式.既然对这个方法的调用都是在相同的运行循环中执行的,我们将使用一个bool来跟踪什么时候执行代码和一个调度异步来重置bool.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { BOOL toReturn = NO; if (!self.shouldTextFieldPreventChange) { self.shouldTextFieldPreventChange = YES; dispatch_async(dispatch_get_main_queue(),^{ // iOS8.3 custom keyboards might call this method along with internal iOS // code. Allowing changes on the next run loop helps avoid this issue. self.shouldTextFieldPreventChange = NO; }); // do work... } return toReturn; }