【问题标题】:Changing uitextfield return key type while editing编辑时更改 uitextfield 返回键类型
【发布时间】:2013-09-01 05:11:41
【问题描述】:

我有 4 个 uitextfields 可以识别它们何时为空或完整。如果完成,他们将返回键类型更改为 GO,否则为默认值。问题是即使我使用 reloadinputview,键盘也不会改变键类型

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

【问题讨论】:

    标签: iphone ios objective-c uitextfield


    【解决方案1】:

    我在更改returnKeyType后使用了以下内容,它在iOS7和iOS6.1中似乎运行良好:

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

    【讨论】:

    • 精彩纷呈。这应该是公认的答案。
    • 这么久后不再出现这个问题,但我尝试重新加载输入视图。我现在使用 Xcode 7.1 和 ios9,但它不适合我。关于现在如何做到这一点的任何想法?
    【解决方案2】:

    试试这个。

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

    【讨论】:

      【解决方案3】:

      根据文档,reloadInputViews 仅影响自定义输入视图,而不影响标准键盘。

      我为解决这个问题所做的就是调用resignFirstResponder,然后调用becomeFirstResponder。这将在没有任何动画的情况下更新键盘:

      代替:

      [textFiled reloadInputViews];
      

      做:

      [textField resignFirstResponder];
      [textField becomeFirstResponder];
      

      【讨论】:

      • 现在试过了,但似乎没有那种效果。是否有可能因为我使用的是 ios 7 对它有任何影响?
      • 不要在 ios6 和 7 上工作。而且会有一些副作用,因为它会调用 textFieldDidEndEditing: 然后 textFieldDidBeginEditing: 方法。
      • [textField resignFirstResponder]; [文本字段成为FirstResponder];效果很好!
      • 正如其他 cmets 所描述的那样,这并不安全,尤其是如果您已登录 textFieldDidEndEditing 和 textFieldDidBeginEditing
      【解决方案4】:

      在 Swift 5 中

       // Change returnKeyType based on textField text
      func textFieldDidChangeSelection(_ textField: UITextField) {
          // Change return key to Done when text entered
          if textField.text != "" {
              textField.returnKeyType = .done
              textField.reloadInputViews()
          }
          // Change back to default style if all text removed
          else {
              textField.returnKeyType = .default
              textField.reloadInputViews()
          }
      

      【讨论】:

        【解决方案5】:

        我在更改returnKeyType后使用了以下内容,它在iOS7和iOS6.1中似乎运行良好:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-21
          相关资源
          最近更新 更多