ResignFirstResponder无法关闭键盘(iPhone)

7

我在这个网站上搜索了一下,没找到解决我现在面临问题的方法。希望有人能帮忙。

我在iPhone应用程序中创建了一个UIAlertView来提示用户输入他们的名字。

    UIAlertView *enterNameAlert = [[UIAlertView alloc] initWithTitle:@"Enter your name"
                                                             message:@"\n\n\n"
                                                            delegate:self
                                                   cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
                                                   otherButtonTitles:NSLocalizedString(@"OK", nil),nil];

    UITextField *enterNameField = [[UITextField alloc] initWithFrame:CGRectMake(16, 83, 252, 25)];
    enterNameField.keyboardAppearance = UIKeyboardAppearanceAlert;
    enterNameField.borderStyle = UITextBorderStyleRoundedRect;
    enterNameField.autocorrectionType = UITextAutocorrectionTypeNo;
    enterNameField.clearButtonMode = UITextFieldViewModeWhileEditing;
    enterNameField.returnKeyType = UIReturnKeyDone;
    enterNameField.delegate = self;
    [enterNameField becomeFirstResponder];
    [enterNameAlert addSubview:enterNameField];

    [enterNameAlert show];
    [enterNameAlert release];
    [enterNameField release];

我在头文件中设置了这个视图控制器以符合UITextFieldDelegate的要求,并实现了textFieldShouldReturn:方法,试图在用户按下完成按钮时关闭键盘。

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    if ([textField isFirstResponder]) {
        [textField resignFirstResponder];
        NSLog(@"text field was first responder");
    } else {
        [textField becomeFirstResponder];
        [textField resignFirstResponder];
        NSLog(@"text field was not first responder");
    }
    NSLog(@"textfieldshouldreturn");
    return YES;
}

在调试器中,我确认当我点击完成按钮时,这个方法被成功地调用,并且此时textField是第一个响应者。然而,键盘没有消失,但清除按钮已经消失了。很明显,textField不再是第一个响应者,因为当我再次点击Done按钮时,没有任何东西被调用。我只想用Done按钮隐藏键盘。请问有人可以提供解决方案吗?非常感谢。

如果您将文本字段设置为视图控制器中的属性,以确保在警报被解除后仍然保留它,会发生什么情况?我想知道是否在事件循环发送resignFirstResponder消息之前,它已被释放或出现了一些奇怪的问题。附言:我们以前一起工作过吗? - clozach
6个回答

6

首先需要在接口头文件中定义你的enterNameAlert,然后使用以下代码:

- (void)viewDidLoad {    
    [super viewDidLoad];
    enterNameAlert = [[UIAlertView alloc] initWithTitle:@"Enter your name"
                                                             message:@"\n\n\n"
                                                            delegate:self
                                                   cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
                                                   otherButtonTitles:NSLocalizedString(@"OK", nil),nil];

    UITextField *enterNameField = [[UITextField alloc] initWithFrame:CGRectMake(16, 83, 252, 25)];
    enterNameField.keyboardAppearance = UIKeyboardAppearanceAlert;
    enterNameField.borderStyle = UITextBorderStyleRoundedRect;
    enterNameField.autocorrectionType = UITextAutocorrectionTypeNo;
    enterNameField.clearButtonMode = UITextFieldViewModeWhileEditing;
    enterNameField.returnKeyType = UIReturnKeyDone;
    enterNameField.delegate = self;    
    [enterNameAlert addSubview:enterNameField];
    [enterNameField becomeFirstResponder];
    [enterNameAlert show];    
    [enterNameField release];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    if ([textField isFirstResponder]) {
        [textField resignFirstResponder];
        [enterNameAlert dismissWithClickedButtonIndex:1 animated:YES];
        [enterNameAlert release];
        NSLog(@"text field was first responder");
    } else {
        [textField becomeFirstResponder];
        [textField resignFirstResponder];
        NSLog(@"text field was not first responder");
    }
    NSLog(@"textfieldshouldreturn");
    return YES;
}

这个可行!!但我必须从-(BOOL)textFieldShouldReturn:(UITextField *)textField方法中移除[enterNameAlert release]。否则,当我点击完成按钮后,应用程序将会崩溃并退出。但我对内存方面不是很熟悉。这样做会有任何内存泄漏吗? - Anthony
如果你不想在textFieldShouldReturn中释放enterNameAlert,那没关系。 但是你必须在实现的其他地方释放它。比如:-dealloc{ [enterNameAlert release]; [super dealloc]; } - Usama Ahmed

0

简单地做

[mytextField addTarget:self 
            action:@selector(methodToFire:)
            forControlEvents:UIControlEventEditingDidEndOnExit];

0
如果有人在Storyboard上遇到了麻烦,我必须进入我的UITextFields属性,并从其代理向其根视图控制器进行ctrl+拖动,这样一切都解决了。

0
如果将文本字段的释放移动到调用 resignFirstResponder 方法之后的委托方法中,会发生什么?

0

尝试在TextField的“DidEndOnExit”事件上使用resignFirstResponder来关闭键盘。

然后,在完成输入数据后,尝试通过按键盘上的“完成”按钮来关闭键盘。

希望这可以帮助到您。


在-(IBAction)DidEndOnExit : (id)sender上实现resignFirstResponder: { //您的代码放在这里 } - Parth Bhatt
这个以上的解决方案有帮助吗? - Parth Bhatt

0

让另一个对象成为第一响应者,然后立即放弃第一个响应者。


抱歉,我不太确定如何实现这个。 - Anthony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接