2013-09-01 74 views
5

我有4個uitextfields,可以識別它們何時爲空或完整。如果完成,他們將返回鍵類型更改爲GO,否則爲默認值。問題是,即使我使用reloadinputview編輯時更改uitextfield返回鍵類型

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

回答

2

根據該文檔時,reloadInputViews隻影響自定義輸入看法,並不標準鍵盤鍵盤並沒有改變密鑰類型。

我所做的解決這個問題的方法是致電resignFirstResponder,然後becomeFirstResponder。這將更新鍵盤沒有任何動畫:

相反的:

[textFiled reloadInputViews]; 

做:

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

試了一下,但現在它似乎沒有這個作用。是否有可能是因爲我使用ios 7會對其產生任何影響? –

+3

不要在ios6和7上工作。並且會有一些副作用,因爲它會調用'textFieldDidEndEditing:'然後'textFieldDidBeginEditing:'方法。 – Martin

+0

[textField resignFirstResponder]; [textField becomeFirstResponder];效果很好! –

13

我用改變returnKeyType後下面,它似乎在iOS7工作非常好, iOS6.1:

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

} 
+1

確實,它工作得很好! – Martin

+1

翻轉輝煌。這應該是被接受的答案。 – Barry

+0

這麼長時間後再次沒有提出這個問題,但我嘗試重新加載輸入視圖。我現在正在使用Xcode 7.1和ios9,但它不適合我。關於如何做到這一點的任何想法? – Esko918

3

試試這個。

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

我用改變後returnKeyType下,它似乎在iOS7和iOS6.1工作得很好:

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

}