【问题标题】:ResignFirstResponder doesn't dismiss the keyboard (iPhone)ResignFirstResponder 不会关闭键盘 (iPhone)
【发布时间】:2011-03-21 17:38:45
【问题描述】:

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

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

    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];

我已经设置了这个 viewController 以符合头文件中的 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 是第一响应者。然而,键盘并没有消失,只是小 clearButton 消失了。很明显,textField 不再是第一响应者,因为当我再次单击“完成”按钮时,什么都没有被调用。我只想用完成按钮关闭键盘。任何人都可以提供解决方案吗?百万谢谢。

【问题讨论】:

  • 如果您将文本字段设置为视图控制器中的属性,从而确保即使在警报被解除后仍保留它,会发生什么?我想知道它是否可能在事件循环开始发送 resignFirstResponder 消息或类似的奇怪消息之前被释放。附:我们以前一起工作吗?

标签: iphone keyboard uitextfield uialertview dismiss


【解决方案1】:

首先您需要在接口标头中定义您的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]。否则,在我单击完成按钮后,应用程序将简单地崩溃并退出。但我对记忆的东西并不熟悉。这样做会不会有内存泄漏?
  • 如果您不想在 textFieldShouldReturn 中释放 enterNameAlert。没关系。但是您必须在实现中的其他地方发布它。可以说:-dealloc{ [enterNameAlert release]; [超级释放]; }
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    当您完成将数据输入到 TextField 后,尝试通过按键盘上的完成按钮来关闭键盘。

    希望这会有所帮助。

    【讨论】:

    • 在 -(IBAction)DidEndOnExit 上实现 resignFirstResponder : (id)sender { //你的代码在这里 }
    • 上述解决方案有帮助吗?
    【解决方案4】:

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

    【讨论】:

    • 抱歉,我不太确定如何实现。
    【解决方案5】:

    简单地做

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

    【讨论】:

      【解决方案6】:

      如果有人在情节提要中遇到此问题,我必须进入我的 uitextfields 属性并 ctrl+从它的委托拖到它的根视图控制器,所有这些都在情节提要中,并且修复了所有问题..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-08
        • 1970-01-01
        • 1970-01-01
        • 2013-12-09
        • 1970-01-01
        • 2011-02-19
        • 2010-09-28
        相关资源
        最近更新 更多