编辑时更改 uitextfield 返回键类型
Posted
技术标签:
【中文标题】编辑时更改 uitextfield 返回键类型【英文标题】:Changing uitextfield return key type while editing 【发布时间】: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;
【问题讨论】:
【参考方案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];
【讨论】:
以上是关于编辑时更改 uitextfield 返回键类型的主要内容,如果未能解决你的问题,请参考以下文章
Xcode UI 测试无法编辑多个 UITextFields