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的空格?
你能澄清为什么没有调用DeleteBackward方法吗?
编辑:1
我向Xamarin的forum提交了同样的问题.看起来像iOS8 xamarin中的一个错误,因为在iOS 7.1中,它们的作品是有害的.
这是一个bug.这是details
解决方法
这个代码稍微在私有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;
}