
var input = new BackspaceTextFIEld(RectangleF.Empty);etcinput.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的空格?
你能澄清为什么没有调用DeleteBackward方法吗?
编辑:1
我向Xamarin的forum提交了同样的问题.看起来像iOS8 xamarin中的一个错误,因为在iOS 7.1中,它们的作品是有害的.
这是一个BUG.这是details
解决方法 很多人一直在说这是一个错误,但是由于这个问题仍然存在于通用汽车中,我开始认为这可能是一个逻辑上的变化.就这样说,我为我的应用程序编写了一些代码,并在iOS 7-8上进行了测试.这个代码稍微在私有API的红线之前,但你应该没有问题使用它.我的应用程序与此代码在应用商店.
将以下方法添加到您的UITextFIEld子类.
- (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;} 总结 以上是内存溢出为你收集整理的xamarin.ios – 在iOS8中检测UITextField中的backspace全部内容,希望文章能够帮你解决xamarin.ios – 在iOS8中检测UITextField中的backspace所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)