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;
}