2011-08-23 4 views
6

cerco di sottoclasse UITextField come segue per implementare rightView personalizzato come un pulsante Cancella:UITextField rightView "WhileEditing" problema

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

ma il problema è: quando il campo di testo diventa solo messa a fuoco, "chiaro" -per diventa anche visibile e dopo che ho iniziato a toccare la tastiera scompare. Qualche idea?

risposta

5

mi capita di incontrare lo stesso problema, anche. Immagino che questo sia un bug iOS, tuttavia, ho provato a risolvere questo problema seguendo le implementazioni e funziona bene per me. Spero che questo ti possa aiutare.

- (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 utilizzare: [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

Sottoclasse UITextField e 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

semplice codice per risolvere questo problema

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

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

ho scritto una classe open source, STAResizingTextField, che consente di specificare le immagini dei pulsanti dei campi di testo chiari personalizzato.