2010-05-13 101 views
48

这可能是一个愚蠢的问题,但我无法在文档中找到答案。弹出式键盘上的“完成”按钮是否始终导致键盘消失?我看到了很多像这样的代码在网络上:iPhone键盘,完成按钮和resignFirstResponder

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { 
    [theTextField resignFirstResponder]; 
    return YES; 
} 

当我按下“完成”按钮,弹出键盘下来,UITextField辞职第一响应。

我假设按下“完成”按钮并未用于导致UITextFieldresignFirstResponder,但该行为在某个时间发生了变化。

我调试的OS 3.0 - 3.1.3

+1

见https://developer.apple.com/library/ios/#documentation/iphone/conceptual/iPhone101/Articles/05_ConfiguringView.html – 2012-02-09 22:13:38

+1

显然,我不没有足够的代表只是给nevan king的回答添加评论,所以我会在这里提到他的解决方案没有必要让这个类成为UITextFieldDelegate。 UITextFieldDelegate协议只是定义了一些发送给委托的消息,询问文本字段是否应该辞职,它是否会辞职等等......任何对象都可以以他完成的方式定义他们的方法与textFieldFinished。 – 2012-07-27 15:16:14

回答

89

我与只是一个的UITextField一个小的测试项目,这个代码

#import <UIKit/UIKit.h> 
@interface TextFieldTestViewController : UIViewController 
<UITextFieldDelegate> 
{ 
    UITextField *textField; 
} 
@property (nonatomic, retain) IBOutlet UITextField *textField; 
@end 

#import "TextFieldTestViewController.h" 
@implementation TextFieldTestViewController 
@synthesize textField; 

- (void)viewDidLoad 
{ 
    [self.textField setDelegate:self]; 
    [self.textField setReturnKeyType:UIReturnKeyDone]; 
    [self.textField addTarget:self 
        action:@selector(textFieldFinished:) 
     forControlEvents:UIControlEventEditingDidEndOnExit]; 
    [super viewDidLoad]; 
} 
- (IBAction)textFieldFinished:(id)sender 
{ 
    // [sender resignFirstResponder]; 
} 

- (void)dealloc { 
    [super dealloc]; 
} 
@end 

文本字段是未修饰的UITextField拖到NIB,与连接的插座。
加载应用程序后,单击文本字段将弹出键盘。按下“完成”按钮会使文本字段失去焦点并在键盘上显示动画。请注意,围绕网络的建议总是使用[sender resignFirstResponder],但这种方式没有它。为完成按钮

+0

嗯。什么是addTarget:action:forControlEvents:for?是不是setDelegate:够了?让我一个人尝试一下。 – bealex 2010-05-13 21:28:01

+0

是的,确切地说。如果你将删除addTarget:...调用,一切都会好起来的。 – bealex 2010-05-13 21:39:12

+1

对于像我这样的noobs来说,使用界面生成器来做到这一点的方法是将“退出时结束”中的+拖动到文件的所有者,然后将其分配给不执行任何操作的IBAction(textFieldFinished:(id)sender in this例)。上面的答案是正确的,只是想补充一下。 – 2011-09-14 17:29:03

6

从文档(任何版本):

这是你的应用程序的 责任在自己选择的时间以关闭键盘 。您的 可能会将键盘响应 解除为特定的用户操作,例如 用户轻击用户界面中的特定按钮。当用户 按下 键盘本身的“返回”键时,您可能还会将 配置为 关闭键盘。要解雇 键盘,请将 resignFirstResponder消息发送到 文本字段,该字段是当前响应者的第一个 响应者。这样做会导致文本 字段对象结束当前 编辑会话(与代表 对象的同意)并隐藏 键盘。

所以,你必须以某种方式发送resignFirstResponder。但在处理textFieldShouldReturn:消息时,textfield有可能失去另一种焦点。这也会导致键盘消失。

+0

感谢您的回答。我找到了导致'UITextField'辞职的第一响应者。我有一个电话'\t [textField addTarget:self action:@selector(textFieldDone :) forControlEvents:UIControlEventEditingDidEndOnExit]'。奇怪的是,'textFieldDone:'方法是空的(我删除了'resignFirstResponder'调用)。所以我仍然不知道为什么键盘消失。 – 2010-05-13 18:31:57

+0

也许你隐式地将焦点移动到另一个组件?例如通过改变表格或标签中的某个值? – bealex 2010-05-13 19:35:15

+0

我不这么认为,还有其他事情正在发生。我创建了一个小型项目(贴出下面的代码),它给出了相同的行为。不太确定它为什么会发生。 – 2010-05-13 21:12:38

2

一行代码: -

[yourTextField setReturnKeyType:UIReturnKeyDone]; 

而上的TextField的添加的valueChanged操作方法和添加此LINE-

[yourTextField resignFirstResponder]; 
13

在Xcode中5。1

启用完成按钮

  • 在属性检查器的UITextField在故事板中找到字段“返回键”,然后选择“完成”完成按下

    隐藏键盘

  • 在Storyboard中让您的ViewController成为UITextField的代表
  • 此方法添加到您的ViewController

    -(BOOL)textFieldShouldReturn:(UITextField *)textField 
    { 
        [textField resignFirstResponder]; 
        return YES; 
    } 
    
相关问题