GSe*_*rjo 11 xamarin.ios xamarin ios8
为了检测Backspace,我已经覆盖了DeleteBackward方法(应该适用于iOS5 +)
var input = new BackspaceTextField(RectangleF.Empty);
etc
input.BecomeFirstResponder();
Run Code Online (Sandbox Code Playgroud)
这是代码
public sealed class BackspaceTextField : UITextField
{
public BackspaceTextField(RectangleF frame) : base(frame)
{
}
public override void DeleteBackward ()
{
Console.WriteLine ("DeleteBackward");
}
}
Run Code Online (Sandbox Code Playgroud)
当我按"Backspace"按钮时没有任何反应.我希望应该出现"DeleteBackward"消息
环境:iOS8,xamarin
编辑:0
关于objective-c的类似问题:检测UITextField中的退格
我做了额外的检查.DeleteBackward是来自UIKeyInput协议的方法,所以我检查insertText方法,这个方法可以正常工作.
public override void InsertText (string text)
{
base.InsertText(text);
}
Run Code Online (Sandbox Code Playgroud)
我已经检查deleteBackward了objective-c,它也很完美.
您对如何在iOS8中的UITextField中检测退格有任何想法吗?
你能澄清为什么DeleteBackward没有调用这个方法吗?
编辑:1
我已经向Xamarin的论坛提交了同样的问题.看起来像iOS8 + xamarin中的一个错误,因为在iOS 7.1中可以正常工作.
这是一个错误.这是细节
cno*_*gr8 24
很多人一直在说这是一个错误,但由于这个问题在GM中仍然存在,我开始认为它可能是逻辑上的变化.话虽如此,我为我的应用程序编写了这段代码,并在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;
}
Run Code Online (Sandbox Code Playgroud)
为了解释一下,调用super的实现方法以避免丢失继承的代码.-deleteBackward如果没有文本,那么打电话后,iOS版本介于8-8.2之间.
编辑:2015年1月28日
子类化子类UITextField的-deleteBackward方法也可能有所帮助.这修复了一些有条件的错误.一种是如果你使用自定义键盘.这是该方法的一个例子.
- (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:@""];
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:答案翻译成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;
}
Run Code Online (Sandbox Code Playgroud)
在ios 7.1和8.1上验证
编辑:2015年4月14日
从iOS 8.3开始,此问题已得到修复.Objective-C代码已更新以反映更改.
编辑:2015年7月24日
正如@nischalhada所评论的那样,存在-textField:shouldChangeCharactersInRange:replacementString:两次调用文本字段的状态.使用自定义键盘时,iOS> = 8.3时存在问题.我的解决方案并不理想,但它完成了工作,我不确定是否还有其他办法.由于对此方法的两次调用都是在同一个运行循环上执行的,因此我们将使用bool来跟踪何时执行代码以及调度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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3946 次 |
| 最近记录: |