【问题标题】:Dismiss The Keyboard - Multiple UITextFields in iOS 7关闭键盘 - iOS 7 中的多个 UITextFields
【发布时间】:2017-06-29 16:19:27
【问题描述】:

您将在下面找到我的主视图控制器的 .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;
}

【问题讨论】:

  • 你是通过连接代理来解决的吗?
  • [self.view endEditing:YES];必须为你工作
  • 取消注释第一行 _dancePlace.delegate = self; 时会出现什么错误?
  • 不,_dancePlace.delegate = self; 只有那一行。不是其他两个。看看错误。在您的行中,您说的是“此文本字段是此视图控制器”。你需要说,“这个文本字段的代表就是这个视图控制器”。
  • 好的,终于开始工作了....self.dancePlace.delegate = self;终于设置了该死的东西!哎呀,什么鬼!

标签: ios objective-c xcode uitextfield


【解决方案1】:

尝试以下方法:

[[self view] endEditing:YES]

【讨论】:

  • 为什么这被否决了?在您不必检查单个 UITextFields 和 UITextViews 的情况下,这是关闭键盘的最佳方法。
  • 这是最好的解决方案!它应该被接受!
  • 这是最好的解决方案。
  • 我多年来一直在寻找这个解决方案,现在有了。一行简单的代码。终于!
【解决方案2】:

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

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

点击视图关闭键盘: 如下向您的 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;

【讨论】:

  • 你摇滚!!!这正是我要找的东西!!!亲爱的!非常感谢!并清楚地告诉我确切的去向。 :-) 正是新人所需要的!
  • 很高兴知道我能够帮助你..快乐编码:)
  • 说得太早了。这仅适用于 1 个字段....这不应该适用于所有字段吗????
  • 是的。它应该..做一件事..在textFieldDidBeginEditing中,放置一个断点,然后控制台执行“po textField.delegate”,然后执行“po self”..如果地址相同,它应该可以工作,如果不是那么你没有设置文本字段的代表正确。您需要为每个文本字段检查此项。你需要为你添加的每个文本字段设置委托。
  • 因为您尚未在添加多个文本字段的位置发布代码,并且代码代码仅适用于第一个文本字段,我猜您只设置了第一个文本字段的委托。您需要为添加的每个 textField 设置委托。请检查这个。
【解决方案3】:

此答案适用于 iOS 7 和 arc,

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

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

接下来,在 main.storyboard 中选择 textField 并从连接检查器中选择 control + 将“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];
        }
    

【讨论】:

    【解决方案4】:
      -(BOOL) textFieldShouldReturn: (UITextField *) textField{
    
            [textField resignFirstResponder];
            return YES;
      }
    

    同时连接您的UITextField代表

    【讨论】:

    • 我试过了。它对我不起作用。是的,我已经清理了应用程序,重置了整个东西,yadda yadda yadda。我无法触发那段代码。其次,它没有回答我的问题,是否每个命名的 uitextfield 都需要自己的 resignfirstresponder ???
    • 你连接代理了吗?
    【解决方案5】:

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

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

    【讨论】:

    • 这是有效的,建议在WWDC
    【解决方案6】:

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

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

    这意味着您应该使用 Mirko Catalano 建议在 textField 上调用 resignFirstResponder 的方法,而不是像您之前在单个属性上所做的那样。

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

    【讨论】:

      【解决方案7】:

      尝试使用self.dancePlace.delegate = self; 而不是dancePlace.delegate = self; 来设置 UITextFieldDelegate。这行得通吗?

      【讨论】:

        【解决方案8】:

        在 Swift 3 中:

         //Dismiss keyboard , When touch outside
         override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
            {
                self.view.endEditing(true)
            }
        

        【讨论】:

          猜你喜欢
          • 2013-07-28
          • 1970-01-01
          • 1970-01-01
          • 2019-11-26
          • 2011-10-17
          • 2015-12-19
          • 1970-01-01
          • 1970-01-01
          • 2019-03-09
          相关资源
          最近更新 更多