2011-08-23 2 views
6

Я пытаюсь создать подкласс UITextField следующим образом реализовать собственный rightView как Clear кнопки:UITextField rightView «WhileEditing» проблема

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

но проблема: когда текстовое поле только становится фокусом, «ясно» -кнопка становится видимый тоже, и после того, как я начну использовать клавиатуру, она исчезает. Есть идеи?

ответ

5

Я встречаюсь с такой же проблемой, тоже. Я предполагаю, что это ошибка 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; 
} 
3

Вы Шоуда использовать: [self setRightViewMode:UITextFieldViewModeAlways];

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

Подкласс UITextField и override -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]; 
    } 
} 
0

Простой код для решения этой задачи

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

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

Я написал класс с открытым исходным кодом, STAResizingTextField, что позволяет определить пользовательские четкие изображения кнопок текстового поля.

Смежные вопросы