2011-09-13 25 views
11

Dodaję niestandardowy przycisk usuwania (UIButton) do UITextField jako rightView, jednak odkryłem, że istnieje pewne dziwne zachowanie w viewMode. Wygląda na to, że nie wyświetla się tak, jak normalny przycisk kasowania, pomimo ustawionego trybu wyświetlania. Przykładowy kod poniżej:UITextField rightViewMode dziwne zachowanie

UITextField *f = [[[UITextField alloc] init] autorelease]; 
f.frame = CGRectMake(0, 0, 300, 44); 
f.backgroundColor = [UIColor clearColor]; 
f.textColor = [UIColor whiteColor]; 

f.clearButtonMode = UITextFieldViewModeNever; 

UIImage *image = [UIImage imageNamed:@"Image.png"]; 

UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom]; 
b.frame = CGRectMake(0, 0, image.size.width, image.size.height); 
[b setImage:image forState:UIControlStateNormal]; 

f.rightView = b; 
f.rightViewMode = UITextFieldViewModeWhileEditing; 

Przycisk wyświetla prawidłowo w następujących stanach:

  • Pokazy podczas ostrych i żaden tekst
  • Pokazy podczas skoncentrowany i wpisując
  • Ukrywa gdy nie ma ostrości

Jeśli jednak pole tekstowe ma już treść, a Ty zmienisz fokus na to, przycisk "wyczyść" nie ma w jaki sposób. Aby ponownie go wyświetlić, musisz usunąć cały tekst i przełączać ostrość w tę iz powrotem.

Nie znalazłem nikogo innego z tym problemem, więc od jakiegoś czasu drapałem się po tym. Każde światło rzucające bardzo cenne.

+0

Wystarczy, aby wyjaśnić przycisk robi pojawiać w ogóle? Może spróbuj zmniejszyć rozmiar/rozmiar przycisku? Ive miał rzeczy nie pojawiają się, ponieważ były zbyt duże. – Codr

+0

Czy zgłosiłeś błąd firmie Apple? – user500

+0

nie zapomnij dodać właściwości "UITextFieldViewModeAlways". –

Odpowiedz

8

To rozwiązuje problem:

- (BOOL)becomeFirstResponder 
{ 
    BOOL ret = YES ; 

    ret = [super becomeFirstResponder] ; 

    if(ret && (_setupClearButtonMode == UITextFieldViewModeWhileEditing)) 
     self.rightViewMode = UITextFieldViewModeAlways ; 

    return ret ; 
} 

- (BOOL)resignFirstResponder 
{ 
    BOOL ret = YES ; 

    ret = [super resignFirstResponder] ; 

    if(ret && (_setupClearButtonMode == UITextFieldViewModeWhileEditing)) 
     self.rightViewMode = UITextFieldViewModeWhileEditing ; 

    return ret ; 
} 

W swojej podklasy UITextField z _setupClearButtonMode var ustawiony na init.

1

Niedawno wystąpił ten sam problem i zakończyłem ustawianie trybu podglądu poprawnego na UITextFieldViewModeAlways i ręczne pokazywanie/ukrywanie tego przycisku, gdy jest potrzebny (delegat proxy, który monitorował stan pola tekstowego, ustawiał widoczność przycisku i przekazywał wiadomości do faktycznego delegata) .

1

Prosty kod dla rozwiązania tego problemu

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

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