问题 UITextField rightViewMode奇怪的行为


我正在向UITextField添加一个自定义清除按钮(UIButton)作为rightView,但是我发现viewMode上有一些奇怪的行为。尽管设置了视图模式,但它似乎不像普通的清除按钮那样显示。示例代码如下:

UITextField *f = [[[UITextField alloc] init] autorelease];
f.frame = CGRectMake(0, 0, 300, 44);
f.backgroundColor = [UIColor clearColor];
f.textColor = [UIColor whiteColor];

f.clearButtonMode = UITextFieldViewModeNever;

UIImage *image = [UIImage imageNamed:@"Image.png"];

UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
b.frame = CGRectMake(0, 0, image.size.width, image.size.height);
[b setImage:image forState:UIControlStateNormal];

f.rightView = b;
f.rightViewMode = UITextFieldViewModeWhileEditing;

该按钮在以下状态下正确显示:

  • 显示焦点,没有文字
  • 在聚焦和打字时显示
  • 没有焦点时隐藏

但是,如果文本字段已经包含内容,并且您将焦点切换到它,则不会显示清除按钮。要让它再次显示,您必须删除所有文本,并来回切换焦点。

我还没有找到任何有这个问题的人,所以一直在这个问题上摸不着头脑。任何光线都非常受欢迎。


2955
2017-09-13 11:41


起源

只是为了澄清按钮根本没有出现?也许尝试减小图像大小/按钮大小?我没有出现因为它们太大而没有出现的东西。 - Codr
你有没有向Apple提交错误? - user500
不要忘记添加'UITextFieldViewModeAlways'属性。 - Vineesh TP


答案:


这修复了错误:

- (BOOL)becomeFirstResponder
{
    BOOL ret = YES ;

    ret = [super becomeFirstResponder] ;

    if( ret && ( _setupClearButtonMode == UITextFieldViewModeWhileEditing ) )
        self.rightViewMode = UITextFieldViewModeAlways ;

    return ret ;
}

- (BOOL)resignFirstResponder
{
    BOOL ret = YES ;

    ret = [super resignFirstResponder] ;

    if( ret && ( _setupClearButtonMode == UITextFieldViewModeWhileEditing ) )
        self.rightViewMode = UITextFieldViewModeWhileEditing ;

    return ret ;
}

在UITextField的子类中 在init上设置var _setupClearButtonMode。


8
2017-10-01 13:27





我最近遇到了同样的问题并最终设置了正确的视图模式到UITextFieldViewModeAlways并在需要时手动显示/隐藏该按钮(使代理委托监视文本字段状态,设置按钮的可见性并将消息传递给实际委托)。


1
2017-10-01 14:57





简单的代码解决了这个问题

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    textField.rightViewMode=UITextFieldViewModeAlways;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
     textField.rightViewMode=UITextFieldViewModeNever;
    return YES;
}

1
2018-04-23 04:43