Ios CustomTextField-自动完成/自动更正赢得';不要随便解雇

Ios CustomTextField-自动完成/自动更正赢得';不要随便解雇,ios,autocomplete,core-text,uitextinput,Ios,Autocomplete,Core Text,Uitextinput,因此,我使用核心图形创建了一个自定义文本视图,并使其符合UITEMPUT和UITEMPUTRAITS协议。除了一个奇怪/恼人的行为外,一切正常。键盘正确地显示自动更正建议,但当用户点击标有“X”的建议时,它不会拒绝该建议,而是插入该建议。我已经检查过了,在所有其他程序中,点击带有“X”的建议会驳回该建议。我该如何解决这个问题 在自定义文本视图中,我有以下IVAR: //UITextInputTraits UITextAutocapitalizationType _uiAutoCap; UITex

因此,我使用核心图形创建了一个自定义文本视图,并使其符合UITEMPUT和UITEMPUTRAITS协议。除了一个奇怪/恼人的行为外,一切正常。键盘正确地显示自动更正建议,但当用户点击标有“X”的建议时,它不会拒绝该建议,而是插入该建议。我已经检查过了,在所有其他程序中,点击带有“X”的建议会驳回该建议。我该如何解决这个问题

在自定义文本视图中,我有以下IVAR:

//UITextInputTraits
UITextAutocapitalizationType _uiAutoCap;
UITextAutocorrectionType _uiAutoCorrect;
UITextSpellCheckingType _uiSpellCheck;
UIKeyboardType _uiKeyboard;
UIKeyboardAppearance _uiKeyboardAppearance;
UIReturnKeyType _uiReturnType;
BOOL _uiEnableAutoReturn;
BOOL _uiSecureText;
将其合成为适当的TextInputRaits属性:

@synthesize autocapitalizationType=_uiAutoCap, autocorrectionType=_uiAutoCorrect, spellCheckingType=_uiSpellCheck, keyboardType=_uiKeyboard, keyboardAppearance=_uiKeyboardAppearance, returnKeyType=_uiReturnType, inputDelegate=_uiTextDelegate, enablesReturnKeyAutomatically=_uiEnableAutoReturn, secureTextEntry=_uiSecureText;
并使用以下默认值初始化它们:

    _uiAutoCorrect = UITextAutocorrectionTypeDefault;
    _uiSpellCheck = UITextSpellCheckingTypeDefault;
    _uiKeyboardAppearance = UIKeyboardAppearanceDefault;
    _uiAutoCap = UITextAutocapitalizationTypeNone;
    _uiReturnType = UIReturnKeyDefault;
    _uiEnableAutoReturn = NO;
    _uiSecureText = NO;
    _uiKeyboard = UIKeyboardTypeDefault;
有什么想法吗?

编辑:可能的答案 当您点击关闭建议时,您的点击可能首先被您的视图截获,这可能会更改文本的选定范围(这会导致UIT接受建议)。这不是最好的解决方案,但它是一个无效的调用

- (NSDictionary *)textStylingAtPosition:(UITextPosition *)position inDirection:(UITextStorageDirection)direction;
因此,当它想要提出建议时,您可以使用一个ivar(BOOL)来存储是否存在建议(在调用UIKeyInput方法时将其值设为“否”,在调用TextStyleing方法时将其值设为“是”)。然后,修改您的手势识别器,使其在上述ivar为“是”且点击位于建议框的矩形中时不会更改选择(您可以通过将从-(CGRect)firstRectForRange:(UITextRange*)范围返回的矩形高度加倍来获得此矩形)。希望能奏效

编辑:您应该能够实现UIgestureRecognitizerDelegate方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
因此,它仅在touch.view==(yourTextView)时接收触摸

我有同样的问题,但还没有解决方案;但是,我认为您应该通过创建返回您想要的属性值的函数来遵守UITRAITS。示例:要使trait UITextAutoCorrectionType的值为UITextAutocorrectionTypeDefault,应提供访问器方法:

- (UITextAutocorrectionType)autocorrectionType {
    return UITextAutocorrectionTypeDefault;
}

我遵守法律。我已经确认,通过更改适当的初始化值(如键盘外观和打开/关闭自动更正)并观察键盘外观/行为的正确更改,可以正确合成属性。就我所知,一切都设置正确。您是正确的,我的视图仍在接收触摸事件,并更改了所选范围,从而提示自动更正提交而不是取消。然而,我所要做的就是实现
-(BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer应该接收touch:(UITouch*)touch{return(touch.view==self);}
。自动更正现在将按其应该的方式取消。谢谢让自动完成显示有任何困难吗?我有一个可以工作的文本编辑器,但我根本不能让自动完成出现。我可以想到几个原因,为什么它可能不会出现。1) 您为
firstRectForRange
提供的CGRect不正确。2) 计算位置或偏移的许多方法之一是错误的。3) 您正在为
markedtextange
返回一个值,而该值应该没有。调试可能是一个巨大的痛苦。我发现,将所有协议方法及其输入值和返回值都记录下来以查找bug是很有帮助的。您可能会发现这很有用:
NSLog(@“%s”,函数)。此日志记录放置它的类/方法。您必须手动记录值。当您在计算机的物理键盘上键入时,模拟器可能不会提示自动更正。尝试单击模拟器屏幕上的键盘按钮。