xamarin.ios – 在iOS8中检测UITextField中的backspace

xamarin.ios – 在iOS8中检测UITextField中的backspace,第1张

概述为了检测Backspace,我已经覆盖了DeleteBackward方法(应该使用iOS5) var input = new BackspaceTextField(RectangleF.Empty);etcinput.BecomeFirstResponder(); 这是代码 public sealed class BackspaceTextField : UITextField{ p 为了检测Backspace,我已经覆盖了DeleteBackward方法(应该使用iOS5)
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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1111153.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存