在尝试允许多个令牌删除时,由于用户持有VENTokenField中的退格键以与原生电子邮件应用或消息应用相同,我遇到了很多问题...
首先,我只能从VENToken的UITextField子类提供的初始代码(技术上触及私有API)- (BOOL)keyboardInputShouldDelete:(UITextField *)textField
检测到退格键上的一次点击。这很好,但对于检测长按退格按钮没有帮助,只有当你在某个UITextField中实际拥有字符时才有效,而不是在UITextField为空时(如我们的情况)。
我也遇到过这个blogpost,它提出了另一种访问更多私有API的方法,但是,它并没有为我的问题提供解决方案。由于没有记录,我想知道是否有一种有效的方法可以检测到这个事件?
答案 0 :(得分:0)
我先解决了这个问题,注释掉VENBackspaceTextField类中的任何内容
keyboardInputShouldDelete:(UITextField *)textField
然后,在VENTokenField标题中添加了2个consts:
NSString * const kTextEmpty = @"\u200B"; // Zero-Width Space
NSString * const kTextHidden = @"\u200D"; // Zero-Width Joiner
每次令牌成为第一响应者时,请确保textField具有空文本:
- (void)inputTextFieldBecomeFirstResponder {
[self.inputTextField becomeFirstResponder];
if (self.tokens.count) {
[self.inputTextField setText:kTextEmpty];
}
...
}
当光标不可见时将其设置为隐藏:
- (void)setCursorVisibility {
NSArray *highlightedTokens = [self.tokens filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(VENToken *evaluatedObject, NSDictionary *bindings) {
return evaluatedObject.highlighted;
}]];
BOOL visible = [highlightedTokens count] == 0;
if (visible) {
[self inputTextFieldBecomeFirstResponder];
} else {
[self.invisibleTextField becomeFirstResponder];
[self.invisibleTextField setText:kTextHidden];
}
}
然后,修改了textField Delegate方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if (self.tokens.count && [string isEqualToString:@""] && [textField.text isEqualToString:kTextEmpty]){
VENToken *lastToken = [self.tokens lastObject];
lastToken.highlighted = YES;
[_inputTextField setText:kTextHidden];
_inputTextField.alpha = 0.0;
return NO;
}
if ([textField.text isEqualToString:kTextHidden]){
[self deleteHighlighted];
[self unhighlightAllTokens];
return (![string isEqualToString:@""]);
}
//If there are any highlighted tokens, delete
[self deleteHighlighted];
return YES;
}