Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.ios 在iOS8的UITextField中检测退格_Xamarin.ios_Xamarin_Ios8 - Fatal编程技术网

Xamarin.ios 在iOS8的UITextField中检测退格

Xamarin.ios 在iOS8的UITextField中检测退格,xamarin.ios,xamarin,ios8,Xamarin.ios,Xamarin,Ios8,为了检测退格,我已经重写了DeleteBackward方法(应该与iOS5+一起使用) 这是密码 public sealed class BackspaceTextField : UITextField { public BackspaceTextField(RectangleF frame) : base(frame) { } public override void DeleteBackward () { Console.WriteL

为了检测退格,我已经重写了
DeleteBackward
方法(应该与iOS5+一起使用)

这是密码

public sealed class BackspaceTextField : UITextField
{
    public BackspaceTextField(RectangleF frame) : base(frame)
    {
    }

    public override void DeleteBackward ()
    {
        Console.WriteLine ("DeleteBackward");
    }
}
当我按下“退格”按钮时,什么也没发生。我希望出现“DeleteBackward”消息

环境:iOS8,xamarin

编辑:0

关于目标c的类似问题:

我做了额外的检查
DeleteBackward
是协议中的方法,所以我检查了
insertText
方法,这个方法工作得很好

public override void InsertText (string text)
{
   base.InsertText(text);
}
我已经在objective-c上检查了
deleteBackward
,它也非常有效

你知道如何在iOS8中检测UITextField中的退格吗

您能否澄清为什么没有调用
DeleteBackward
方法

编辑:1

我已经把同样的问题提交给了Xamarin家。看起来像是iOS8+xamarin中的一个bug,因为在ios7.1中工作得很好

public override void InsertText (string text)
{
   base.InsertText(text);
}

这是一只虫子。这里有一个

准确地说,这是一个Apple iOS8错误。这在苹果的开发者论坛上出现过几次。遗憾的是,这些bug报告无法公开访问,所以我们所知道的是,beta 5仍然会出现这种情况


旁注:一般来说(99%),大多数Xamarin.iOS绑定并不特定于某个iOS版本(即没有版本检查),因此iOS版本之间的不同行为通常是由设计(有文档记录)或苹果的bug(如此)造成的。

很多人都说这是一个bug,但是由于通用汽车公司仍然存在这个问题,我开始认为这可能是一个逻辑上的改变。话虽如此,我为我的应用程序编写了这段代码,并在iOS 7-8上进行了测试

这段代码略早于私有API的红线,但是使用它应该没有问题。带有此代码的我的应用在应用商店中

将以下方法添加到
UITextField
子类中

- (BOOL)keyboardInputShouldDelete:(UITextField *)textField {
    BOOL shouldDelete = YES;

    if ([UITextField instancesRespondToSelector:_cmd]) {
        BOOL (*keyboardInputShouldDelete)(id, SEL, UITextField *) = (BOOL (*)(id, SEL, 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;
}
编辑:答案翻译为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:shouldchangeCharactersRange:replacementString:
被调用两次的状态存在。使用自定义键盘时,iOS>=8.3上存在此问题。我的解决方案并不理想,但确实有效,我不确定是否还有其他办法。由于对该方法的两个调用都在同一个运行循环上执行,因此我们将使用bool跟踪何时执行代码,并使用dispatch async重置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;
}

问题是什么还不清楚,问题是。如何检测按下“退格”按钮。我已经更新了问题。我投票给了好问题的哥们。。谢谢你的提问和回答!但是你为什么不直接调用[super keyboardInputShouldDelete:]?为什么所有带有instancesRespondToSelector等的繁琐程序?因为
super
在私有方法上是不可访问的。如何将其转换为Xamarin C#?同一个函数被调用两次。我遇到麻烦了,有什么想法吗?这个问题的答案很好,我投票赞成这个努力,答案很好,哥们
- (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;
}