30

如何在编辑时更改 iPhone 上的返回键。我知道

myTextField.returnKeyType = UIReturnKeySearch;

但是,这仅在我调用[myTextField resignFirstResponder];then[myTextField becomeFirstResponder];隐藏键盘然后将其带回时才有效。否则,它就和我之前的一样,在这种情况下它是“Go”。我需要根据用户输入的字符不断切换它们。


一句话:如何在键盘仍在编辑时更改键盘的返回键类型?

4

8 回答 8

58

[textField reloadInputViews]似乎可以解决问题...

于 2012-06-01T07:04:01.447 回答
6

前段时间找到了,忘记在这里发了。我在用:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange: 
(NSRange)range replacementString:(NSString *)string {
    [self performSelector:@selector(addressBarTextDidChange:) withObject:nil afterDelay:0.1];
    return YES;
}

-(void)addressBarTextDidChange:(NSString *)text {
    NSString *addressText = @"..."; //Wherever you get your text from... 
    if ([addressText isEqualToString:@""]==NO) {
        if ([addressText rangeOfString:@" "].location != NSNotFound) {
            //[addressBarTextField setReturnKeyType:UIReturnKeySearch];
            if (addressBarTextField.returnKeyType!=UIReturnKeySearch) {
                [UIView beginAnimations:nil context:NULL]; //Setup the animation.
                [UIView setAnimationDuration:0.0]; //The duration for the animation.
                [addressBarTextField resignFirstResponder];
                addressBarTextField.returnKeyType = UIReturnKeySearch;
                [addressBarTextField becomeFirstResponder];
                [UIView commitAnimations];
            }
        } else {
            //[addressBarTextField setReturnKeyType:UIReturnKeyGo];
            if (addressBarTextField.returnKeyType!=UIReturnKeyGo) {
                [UIView beginAnimations:nil context:NULL]; //Setup the animation.
                [UIView setAnimationDuration:0.0]; //The duration for the animation.
                [addressBarTextField resignFirstResponder];
                addressBarTextField.returnKeyType = UIReturnKeyGo;
                [addressBarTextField becomeFirstResponder];
                [UIView commitAnimations];
            }
        }

    } else {
        if (addressBarTextField.returnKeyType!=UIReturnKeyDone) {
            [UIView beginAnimations:nil context:NULL]; //Setup the animation.
            [UIView setAnimationDuration:0.0]; //The duration for the animation.
            [addressBarTextField resignFirstResponder];
            addressBarTextField.returnKeyType = UIReturnKeyDone;
            [addressBarTextField becomeFirstResponder];
            [UIView commitAnimations];
        }
    }
}

基本上,我在 0.0 秒的时间内为键盘输入和输出动画(所以用户不会看到它)。我还在检查键盘在切换之前是否已经不是我想要的键盘,因为不断切换会导致延迟。

于 2012-05-01T03:26:44.387 回答
5

就我而言,它的工作原理如下:

sender.returnKeyType=UIReturnKeyNext;
[sender reloadInputViews];
[sender resignFirstResponder];
[sender becomeFirstResponder];

我不得不强制 risignFirstResponder 后跟一个 becomeFirstResponder。

于 2015-04-27T13:27:51.287 回答
2

我制作了一个自定义类别来公开 returnKeyType。只需导入并执行self.addField.returnKeyType = UIReturnKeySearch;或您喜欢设置为 returnKeyType 的任何内容。您也可以在键盘已经打开时动态使用它。它会自动刷新。

这里是:

界面:

/*

 Simple hack for exposing returnKeyType for UISearchBar without private APIs
 For you from CodeBuffet ;)


 Enjoy!

 ~PW

*/

#import <UIKit/UIKit.h>

@interface UISearchBar (ReturnType)

@property (nonatomic, readwrite) UIReturnKeyType returnKeyType;

@end

执行:

#import "UISearchBar+ReturnType.h"

@implementation UISearchBar (ReturnType)

UITextField *textField;

- (UITextField *) traverseForTextViewInViews: (NSArray*) views
{
    // Traverse over all views recursively until we find the tresure TextField hidden deep the UISearchBar ocean!
    for(UIView *subView in views) {
        if([subView conformsToProtocol:@protocol(UITextInputTraits)]) {
            return (UITextField *) subView;
        }
        UITextField *tv = [self traverseForTextViewInViews:subView.subviews];
        if (tv) {
            return tv;
        }
    }
    return nil;
}

#pragma mark Custom Setters & Getters

- (void)setReturnKeyType:(UIReturnKeyType)returnKeyType
{
    if (!textField) {
        textField = [self traverseForTextViewInViews:self.subviews];
    }
    textField.returnKeyType = returnKeyType;
    [self reloadInputViews];
    [textField reloadInputViews];
}

- (UIReturnKeyType)returnKeyType
{
    if (!textField) {
        textField = [self traverseForTextViewInViews:self.subviews];
    }
    return textField.returnKeyType;
}

@end
于 2013-10-16T14:21:13.660 回答
1

我用这 3 行代码做到了:

[sender setReturnKeyType:UIReturnKeyDone];
[sender resignFirstResponder];
[sender becomeFirstResponder];
于 2015-07-29T09:16:44.210 回答
1

我需要根据文本字段的当前内容更新 returnKeyType (Next <--> Go)。单独设置 returnKeyType 后,文本字段上的 reloadInputViews 方法不起作用。正如其他海报所提到的,resignFirstResponder 后跟 becomeFirstResponder 是必要的。在我的情况下,当文本字段成为 firstResponder 并显示键盘时,它将动画键盘的解雇和重新出现。在较小的设备或横向模式下,它还会导致包含文本字段的视图瞬间跳转。我发现隐藏这种不需要的行为的解决方案是将 resignFirstResponder 和 becomeFirstResponder 放置在 0 秒持续时间的动画块中。

            [UIView animateWithDuration:0.0
                                  delay:0.0
                                options:0
                             animations:^{
                                 [textField reloadInputViews];
                                 [textField resignFirstResponder];
                                 [textField becomeFirstResponder];
                             }
                             completion:nil];
于 2016-09-15T16:55:19.410 回答
0

您是否尝试使用 TextField 的委托:

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField { textField.returnKeyType = UIReturnKeySearch; 返回是;}

于 2012-04-18T04:26:01.707 回答
0

斯威夫特 3

更改returnKeyType您的UITextFieldUITextView致电后:

textFieldOrView.resignFirstResponder()
textFieldOrView.becomeFirstResponder()

尽管在某些情况下调用textFieldOrView.reloadInputViews()有效,但它不如上述解决方案安全。

于 2017-08-25T13:51:44.497 回答