UITextField becomeFirstResponder 在 UIControlEventEditingDidEndOnExit 中不起作用

Posted

技术标签:

【中文标题】UITextField becomeFirstResponder 在 UIControlEventEditingDidEndOnExit 中不起作用【英文标题】:UITextField becomeFirstResponder does not work in UIControlEventEditingDidEndOnExit 【发布时间】:2015-08-14 05:03:32 【问题描述】:

我有一个UITextFieldUILabel。当用户在 textField 中输入一些文本并点击键盘上的“Enter”时,我想将文本保存到标签中,然后清除 textField 并再次使其成为第一响应者。但是出了点问题。 becomeFirstResponder 不起作用。

ViewController的代码如下:

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UITextField *textField;
@property (weak, nonatomic) IBOutlet UILabel *label;

@end

@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];

    [self.textField addTarget:self action:@selector(saveResult:) 
        forControlEvents:UIControlEventEditingDidEndOnExit];


-(void) saveResult: (id) sender 
    self.label.text = self.textField.text;
    self.textField.text = @"";
    [self.textField becomeFirstResponder];


@end

【问题讨论】:

处理用户点击 Enter 键的代码在哪里? UIControlEventEditingDidEndOnExit 发生时发生。 【参考方案1】:

给你,这是一个工作示例,“setFrame”方法是突然出现的,你可以更改它,或者只使用为你完成所有这些工作的委托方法,将它弹出到你的代码,加载一个 iphone 6+ 模拟器,选择显示硬件键盘,这将工作。没有理由向您的 UITextField 添加触摸事件处理程序,因为 Apple 提供的委托方法会为您完成所有工作。

@interface NSHHomeViewController () <UITextFieldDelegate>
@end

@property (weak, nonatomic) IBOutlet UITextField *textField;
@property (weak, nonatomic) IBOutlet UILabel *label;

@end

@implementation ViewController

    UITextField * _passwordField;
    UILabel * hid;

- (void)viewDidLoad 
    [super viewDidLoad];

    hid = [UILabel new];
    [hid setFrame:CGRectMake(80, 200, 300, 60)];
    [hid setFont:fontMagicForBoldNavigationBarNSHFont];
    [hid setBackgroundColor:[UIColor babyBlue]];
    [hid setTextColor:[UIColor blackBean]];
    [self.view addSubview:hid];

   _passwordField = [[UITextField alloc] init];
    [_passwordField setSecureTextEntry:TRUE];
    [_passwordField setPlaceholder:@"Password"];
    [_passwordField setReturnKeyType:UIReturnKeyGo];
    [_passwordField setTextAlignment:NSTextAlignmentLeft];
    [_passwordField setDelegate:self];
    [_passwordField setFont:fontMagicForRegularNSHFont];
    [_passwordField setEnablesReturnKeyAutomatically:true];
    [_passwordField setAutocapitalizationType:UITextAutocapitalizationTypeNone];
    [_passwordField setFrame:CGRectMake(30, SCREEN_HEIGHT/2, SCREEN_WIDTH-60, 55)];
    UIView *spacerView4 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 15, 15)];
    [_passwordField setLeftViewMode:UITextFieldViewModeAlways];
    [_passwordField setLeftView:spacerView4];
    [_passwordField setTextColor:[UIColor NSHBlueColor]];
    [_passwordField setValue:fontMagicForRegularNSHFont forKeyPath:@"_placeholderLabel.font"];
    [_passwordField setClearButtonMode:UITextFieldViewModeAlways];
    [_passwordField setBackgroundColor:[UIColor colorWithWhite:1 alpha:1]];
    [self.view addSubview:_passwordField];


- (BOOL)textFieldShouldReturn:(UITextField *)textField

    if (textField == _passwordField) 
        [hid setText:_passwordField.text];
        [_passwordField setText:@""];
        [_passwordField resignFirstResponder];
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
            [_passwordField becomeFirstResponder];
        );
    
    return TRUE;

这只是一个工作示例,您需要正确声明您的委托并正确声明 UITextField 的委托,如上所示。然后为键盘上的按钮选择您想要的返回键类型,然后您还可以使用 UITextFieldDelegate 的“texFieldShouldReturn”拦截这些事件,您不必调用定时调度队列,但它会将其放在那里以获得效果发布到标签,清除文本,退出键盘,然后在 1/2 秒后,键盘再次成为第一响应者。

【讨论】:

你知道的。我只是替换我的 [self.textField becomeFirstResponder];在 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^ [self.textField becomeFirstResponder]; );它有效。美好的! ) 非常感谢。 完美,看起来比我们都想象的要容易!【参考方案2】:

如果您不再想要目标。在选择器方法中删除目标,它工作正常。

-(void) saveResult: (id) sender 
    self.label.text = self.textField.text;
    self.textField.text = @"";
    [self.textField removeTarget:self action:nil forControlEvents:UIControlEventEditingDidEndOnExit];
    [self.textField becomeFirstResponder];

【讨论】:

【参考方案3】:

在.h文件和.m文件中设置UITextField的Delegate和Datasource,然后试试。

希望对你有帮助。

【讨论】:

以上是关于UITextField becomeFirstResponder 在 UIControlEventEditingDidEndOnExit 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UITextField 子类中设置 UITextField 的属性

UITextField

在 UITextField 操作中将 UITextField 字符串转换为 Double

如何调整 UITextField 占位符文本以适合 UITextField 宽度?

如果添加了新的 UITextField,如何向下移动许多 UITextField

如果 UITextField 已经创建,不要在 Tap 上重新创建 UITextField