2011-08-23 15 views
6

próbuję podklasę UITextField następująco wdrożyć niestandardowe rightView postaci przezroczystego przycisku:UITextField rightView „WhileEditing” problem

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

ale problem jest: gdy pole tekstowe po prostu staje się celem, „czysty” -button staje Widoczne też i po tym, jak zacznę stukać w klawiaturę, znika. Jakieś pomysły?

Odpowiedz

5

spotykam ten sam problem, zbyt. Przypuszczam, że jest to błąd systemu iOS, jednak próbowałem rozwiązać ten problem, wykonując następujące implementacje i działa to dobrze dla mnie. Mam nadzieję, że to ci pomoże.

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

Shoud użyć: [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

Podklasa UITextField i przesłanianie -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

Prosty kod dla rozwiązania tego problemu

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

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

Pisałem otwartą klasę źródłowy, STAResizingTextField, który pozwala określić niestandardowy przycisk Wyczyść pole tekstowe obrazów.