簡體   English   中英

UITextField rightView“WhileEditing”問題

[英]UITextField rightView “WhileEditing” problem

我嘗試按如下方式將UITextField子類化,以將自定義rightView實現為Clear按鈕:

-(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];
}

但問題是:當文本域變成焦點時,“清晰”按鈕也變得可見,在我開始敲擊鍵盤后它消失了。 有任何想法嗎?

我也遇到了同樣的問題。 我想這是一個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;
}

你應該使用: [self setRightViewMode:UITextFieldViewModeAlways];

子類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];
   }
}

用於解決此問題的簡單代碼

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

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

我編寫了一個開源類STAResizingTextField ,它允許您指定自定義明文字段按鈕圖像。

- (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;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM