2011-08-23 11 views
6

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

あなたは使用shoud:[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を、書かれています。

関連する問題