10

下面你会找到我的主视图控制器的 .h 和 .m 文件。

我有 3 个问题。

1.)因为我有多个 uitextfields,我是否必须用自己的 resignFirstResponder 语句设置每个?和 2.) 我会在哪里做,用什么方法?3.) 我的语法是否适合辞去第一响应者?

此外,如果我可以在用户单击字段而不是按返回键时关闭键盘,那将是非常好的!

我知道这已经被问过并回答过,但老实说,我仍然对去哪里感到有点困惑。

我正在使用带有 XCode 5 和 iOS 7 的故事板。

==============================

.h 文件

@interface ViewController : UIViewController <UITextFieldDelegate,UITableViewDelegate,UITableViewDataSource>

@property (weak, nonatomic) IBOutlet UITextField *danceDate;
@property (weak, nonatomic) IBOutlet UITextField *dancePlace;
@property (weak, nonatomic) IBOutlet UITextField *danceTerminal;
@property (weak, nonatomic) IBOutlet UITextField *danceGate;

.m 文件

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self retrieveFromParse];

    self.tableView.dataSource = self;
    self.tableView.delegate = self;
    self.navigationItem.rightBarButtonItem = self.editButtonItem;

    // SET DELEGATE HERE
    //
    // if I uncomment 1 of these lines, i'll get an error.
    //
    // _dancePlace.delegate = self; 
    // dancePlace.delegate = self; 
    // dancePlace = self; 

}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{

}

-(BOOL) textFieldShouldReturn: (UITextField *) textField
{
    [textField resignFirstResponder];

    return YES;
}


-(BOOL) textFieldShouldReturn: (UITextField *) textField
{
    return YES;
}
4

8 回答 8

40

尝试以下操作:

[[self view] endEditing:YES]
于 2013-10-28T23:49:16.410 回答
33

退出 textField:您的所有 textField.delegate 都应设置为 ViewController 的对象。然后实现下面的委托方法。

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

要在点击 View 时关闭键盘:向 ViewController.view 添加一个 Tap 手势,如下所示:

//declare a property to store your current responder
@property (nonatomic, assign) id currentResponder;


//in viewDidLoad:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(resignOnTap:)];
    [singleTap setNumberOfTapsRequired:1];
    [singleTap setNumberOfTouchesRequired:1];
    [self.view addGestureRecognizer:singleTap];
    [singleTap release];

//Implement the below delegate method:

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    self.currentResponder = textField;
}

//Implement resignOnTap:

- (void)resignOnTap:(id)iSender {
    [self.currentResponder resignFirstResponder];
}
// was missing ; after the call --> [self.currentResponder resignFirstResponder]
    // also in textFieldDidEndEditing set self.currentResponder = nil;
于 2013-10-29T01:57:46.473 回答
5

这个答案适用于 iOS 7 和 arc,

  1. 当用户触摸返回时关闭键盘:在 ViewController 添加以下操作

    -(IBAction)textFieldReturn:(id)sender
    {
        [sender resignFirstResponder];
    }
    

接下来,在 main.storyboard 中选择 textField 并从连接检查器控件 + 将“Did End On Exit”事件拖到视图控制器。

  1. 当用户触摸背景时关闭键盘:在 ViewController 中实现以下方法

     - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
            UITouch *touch = [[event allTouches] anyObject];
            if ([YOUR_TEXT_FIELD isFirstResponder] && [touch view] != YOUR_TEXT_FIELD) {
                [YOUR_TEXT_FIELD resignFirstResponder];
            }
            [super touchesBegan:touches withEvent:event];
        }
    
于 2014-03-15T00:46:40.047 回答
4
  -(BOOL) textFieldShouldReturn: (UITextField *) textField{

        [textField resignFirstResponder];
        return YES;
  }

也连接你的UITextField 代表

于 2013-10-28T23:41:37.367 回答
4

这是我在代码中使用的内容。它工作得很好,比其他答案更有效。

在 yourviewcontroller.h 添加:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

现在在 .m 文件中,将其添加到您的 ViewDidLoad 函数中:

- (void)viewDidLoad {
    //Keyboard stuff
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];
}

此外,在 .m 文件中添加此函数:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}
于 2015-01-07T19:58:30.390 回答
1

当有UITextField问题的调用它的委托方法时, - (BOOL)textFieldShouldReturn:(UITextField*)textField它会将自己作为参数传入。

因此,textField可用作此方法参数的特定参数是您关心的特定参数。在此委托方法中,您可以将其称为“textField”。

这意味着您应该使用 Mirko Catalano 建议调用resignFirstResponder的内容,textField而不是像您正在做的单个属性。

Mirko 提出的验证委托确实已分配的建议也很重要。您需要确保笔尖或情节提要中的所有 UITextField 都具有指向文件所有者的委托属性。否则委托消息将无处可去并立即被忽略!

于 2013-10-29T00:50:11.307 回答
1

尝试使用self.dancePlace.delegate = self;而不是dancePlace.delegate = self;设置 UITextFieldDelegate。那样有用吗?

于 2013-10-29T08:35:43.270 回答
0

在迅速 3 中:

 //Dismiss keyboard , When touch outside
 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
    {
        self.view.endEditing(true)
    }
于 2017-06-29T08:19:27.103 回答