VENTokenField保留退格键以删除令牌

时间:2015-03-18 16:18:05

标签: ios objective-c uitextfield backspace

在尝试允许多个令牌删除时,由于用户持有VENTokenField中的退格键以与原生电子邮件应用或消息应用相同,我遇到了很多问题...

首先,我只能从VENToken的UITextField子类提供的初始代码(技术上触及私有API)- (BOOL)keyboardInputShouldDelete:(UITextField *)textField检测到退格键上的一次点击。这很好,但对于检测长按退格按钮没有帮助,只有当你在某个UITextField中实际拥有字符时才有效,而不是在UITextField为空时(如我们的情况)。

我也遇到过这个blogpost,它提出了另一种访问更多私有API的方法,但是,它并没有为我的问题提供解决方案。由于没有记录,我想知道是否有一种有效的方法可以检测到这个事件?

1 个答案:

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