【问题标题】:UITextField rightView "WhileEditing" problemUITextField rightView“WhileEditing”问题
【发布时间】:2011-08-23 18:15:20
【问题描述】:

我尝试将 UITextField 子类化如下,以将自定义 rightView 实现为清除按钮:

-(void) drawRect:(CGRect)rect
{

    [self.layer setBackgroundColor:[[UIColor colorWithRed:20.0/255.0 green:20.0/255.0 blue:20.0/255.0 alpha:1] CGColor]];
    [self.layer setCornerRadius:15.0];

    UIImage  *imgClear = [UIImage imageNamed:@"btnClear"];
    CGSize iSize = [imgClear size];

    UIButton *clearButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, iSize.width, iSize.height)];

    [clearButton setImage:imgClear forState:UIControlStateNormal];
    [clearButton addTarget:self action:@selector(clearText:) forControlEvents:UIControlEventTouchUpInside];

    [self setRightViewMode:UITextFieldViewModeWhileEditing];
    [self setRightView:clearButton];

    [clearButton release];
}

但问题是:当文本字段刚刚成为焦点时,“清除”按钮也变得可见,并且在我开始点击键盘后它消失了。有什么想法吗?

【问题讨论】:

    标签: objective-c ios uibutton uitextfield


    【解决方案1】:

    我也遇到了同样的问题。我想这是一个 iOS 错误,但是,我尝试通过以下实现来解决这个问题,它对我来说很好。希望这会对你有所帮助。

    - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
        ...
        [self addTarget:self action:@selector(onEditing:) forControlEvents: UIControlEventEditingChanged]
        ...
    }
    
    -(void) onEditing:(id)sender {
        if(![self.text isEqualToString:@""]){
            self.rightViewMode = UITextFieldViewModeAlways;
        }else{
            self.rightViewMode = UITextFieldViewModeNever;
        }
    }
    - (BOOL)becomeFirstResponder{
        BOOL ret = YES ;
        ret = [super becomeFirstResponder] ;
        if( ret & ![self.text isEqualToString:@""]){
            self.rightViewMode = UITextFieldViewModeAlways;
        }else{
            self.rightViewMode = UITextFieldViewModeNever;
        }
    
        return ret ;
    }
    - (BOOL)resignFirstResponder
    {
        BOOL ret = YES ;
        ret = [super resignFirstResponder] ;
        if( ret )
            self.rightViewMode = UITextFieldViewModeNever;
        return ret ;
    }
    - (void) clearText:(id)sender
    {
        self.text = @"";
        self.rightViewMode = UITextFieldViewModeNever;
    }
    

    【讨论】:

      【解决方案2】:

      你应该使用:[self setRightViewMode:UITextFieldViewModeAlways];

      【讨论】:

        【解决方案3】:

        子类 UITextField 并覆盖 -layoutSubviews。

        - (void)layoutSubviews
        {
           [super layoutSubviews];
        
           // HACK: There is an iOS bug where the right view is not displayed when there is text in the text field. Also, iOS adds and removes the rightView. This code adds the right view and uses hide-unhide instead.
        
           UIView *rightView = [self rightView];
        
           if (rightView != nil && [self clearButtonMode] == UITextFieldViewModeNever) {
              BOOL showRightView;
              BOOL isFirstResponder = [self isFirstResponder];
        
              switch ([self rightViewMode]) {
              case UITextFieldViewModeNever:
                 showRightView = FALSE;
                 break;
              case UITextFieldViewModeWhileEditing:
                 showRightView = isFirstResponder;
                 break;
              case UITextFieldViewModeUnlessEditing:
                 showRightView = !isFirstResponder;
                 break;
              case UITextFieldViewModeAlways:
              default:
                 showRightView = TRUE;
                 break;         
              }
        
              showRightView = (showRightView && ![[self text] isEqualToString:@""]);
        
              [rightView setFrame:[self rightViewRectForBounds:[self bounds]]];
              [rightView setHidden:!showRightView];
        
              [self addSubview:rightView];
           }
        }
        

        【讨论】:

          【解决方案4】:
          - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
              UITextField *searchField = nil;
              for (UIView *subview in controller.searchBar.subviews) {
                  DebugLog(@"%@",[subview description]);
                  if ([subview isKindOfClass:[UITextField class]]) {
                      searchField = (UITextField *)subview;
                      UIImageView *clearIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ClearIcon.png"]];
                      searchField.rightView = clearIconView;
                      searchField.rightViewMode = UITextFieldViewModeAlways;
          
                      [clearIconView release];
                      break;
                  }
              }
          }
          

          【讨论】:

            【解决方案5】:

            解决这个问题的简单代码

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

            【讨论】:

              【解决方案6】:

              我编写了一个开源类STAResizingTextField,它允许您指定自定义明文字段按钮图像。

              【讨论】: