大佬教程收集整理的这篇文章主要介绍了xamarin.ios – 在iOS8中检测UITextField中的backspace,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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中,它们的作品是有害的.
这个代码稍微在私有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; }
以上是大佬教程为你收集整理的xamarin.ios – 在iOS8中检测UITextField中的backspace全部内容,希望文章能够帮你解决xamarin.ios – 在iOS8中检测UITextField中的backspace所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。