2013-09-01 8 views
5

Mam 4 pola uitext, które rozpoznają, kiedy są puste lub kompletne. Po zakończeniu zmieniają swój typ klawisza powrotu na GO, w przeciwnym razie jest to domyślny. Problemem jest to klawiatura nie zmienia typ klucza, chociaż używam reloadinputviewZmiana typu klucza powrotnego pola uite podczas edycji

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    _fieldsArray = @[_nameField, _passwordField, _emailField, _usernameField]; 
} 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 

    NSRange textFieldRange = NSMakeRange(0, [textField.text length]); 

    //NSLog(@"%d", !(NSEqualRanges(range, textFieldRange) && [string length] == 0)); 

    [self signUpFieldsAreValid:(!(NSEqualRanges(range, textFieldRange) && [string length] == 0) && [self validateSignUpFields:textField])]; 
    [textField reloadInputViews]; 
    return YES; 
} 
- (BOOL)textFieldShouldClear:(UITextField *)textField{ 

    [self signUpFieldsAreValid:NO]; 
    [textField reloadInputViews]; 
    return YES; 
} 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    for (UITextField *aTextField in _fieldsArray) { 
     if (aTextField.isFirstResponder) { 

      aTextField.layer.borderWidth = 0.f; 
      aTextField.layer.borderColor = nil; 

     } 
    } 

    textField.layer.borderWidth = 1.f; 
    textField.layer.borderColor = [UIColor colorWithRed:200.f/255.f green:0.f/255.f blue:4.f/255.f alpha:1.f].CGColor; 

    return YES; 
} 

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    NSUInteger fieldIndex = [_fieldsArray indexOfObject:textField]; 

    [_fieldsArray[(fieldIndex + 1) % 4] becomeFirstResponder]; 

    return YES; 
} 

- (BOOL)validateSignUpFields:(UITextField *)firstResponder 
{ 
    for (UITextField *aTextField in _fieldsArray) { 
     if (!aTextField.text.length && ![aTextField isEqual:firstResponder]) { 
      return NO; 
     } 
    } 

    return YES; 
} 

- (void)signUpFieldsAreValid:(BOOL)valid 
{ 
    NSLog(@"%d", valid); 
    for (UITextField *aTextField in _fieldsArray) { 

     if (valid) { 
      aTextField.returnKeyType = UIReturnKeyGo; 
     } 
     else { 
      aTextField.returnKeyType = UIReturnKeyDefault; 
     } 
    } 
} 

Odpowiedz

2

Zgodnie z docs The reloadInputViews wpływa tylko niestandardowe wejściowych poglądy, a nie standardową klawiaturę.

Co zrobiłem, aby rozwiązać ten problem, to zadzwoń pod numer resignFirstResponder, a następnie becomeFirstResponder. Spowoduje to aktualizację klawiaturę bez animacji:

Zamiast:

[textFiled reloadInputViews]; 

zrobić:

[textField resignFirstResponder]; 
[textField becomeFirstResponder]; 
+0

Próbowaliśmy go już teraz, ale nie wydaje się mieć taki skutek. Czy to możliwe, że ponieważ używam ios 7, mam na tym jakieś konsekwencje? –

+3

Nie działa na ios6 i 7. I będzie kilka efektów ubocznych, ponieważ wywoła metody 'textFieldDidEndEditing:' then 'textFieldDidBeginEditing:'. – Martin

+0

[textField resignFirstResponder]; [textField getFirstResponder]; Działa dobrze! –

13

użyłem następujących po zmianie returnKeyType i wydawało się bardzo dobrze w iOS7 i iOS6.1:

if ([self.textfieldOne isFirstResponder]) { 
    [self.textfieldOne reloadInputViews]; 

} 
+1

Rzeczywiście, działa bardzo dobrze! – Martin

+1

Rzut rewelacyjny. To powinna być zaakceptowana odpowiedź. – Barry

+0

Nie po to po raz kolejny, ale próbowałem przeładować widoki wejściowe. Pracuję teraz z Xcode 7.1 i ios9, ale to nie działa dla mnie. Wszelkie pomysły, jak to zrobić teraz? – Esko918

3

Spróbuj tego.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; 
{ 
    NSString *newStr=[textField.text stringByReplacingCharactersInRange:range withString:string]; 
    if([newStr length] > 0) 
    { 
     textField.returnKeyType = UIReturnKeySearch; 
    } 
    else 
    { 
     textField.returnKeyType = UIReturnKeyDefault; 
    } 
    [textField resignFirstResponder]; 
    [textField becomeFirstResponder]; 
    return YES; 
} 
0

użyłem następujących po zmianie returnKeyType i wydawało się bardzo dobrze w iOS7 i iOS6.1:

if ([self.textfieldOne isFirstResponder]) { 
    [self.textfieldOne reloadInputViews]; 

} 
Powiązane problemy