IOS - как скрыть клавиатуру, если пользователь нажимает на случайные элементы, а не фон?

В моем приложении у меня есть что-то вроде этого:

- (IBAction)backgroundTouch:(id)sender 
{
    [businessDescription resignFirstResponder];
    [self.view endEditing:YES]; 
}

Я не уверен, какая из двух строк, которые я использую, лучше, поэтому я использую обе:). Это работает, когда текстовая область выделена, и пользователь нажимает фон.

Но пользователи не всегда нажимают на фон, а иногда нажимают на другие элементы страницы, например, следующий элемент, который они пытаются заполнить.

В моем снимке экрана у меня есть следующий элемент под текстовой областью, и когда я щелкаю там, клавиатура не скрывается. Может ли кто-нибудь помочь мне скрыть клавиатуру, когда пользователь нажимает на различные элементы страницы и когда текстовая область не выделяется?

Вот мой файл.h:

@interface PlanBusinessController : UIViewController

@property (weak, nonatomic) IBOutlet UITextView *businessDescription;

- (IBAction)submitBusiness:(id)sender;
@property (weak, nonatomic) IBOutlet UIButton *buttonProperty;

@property (weak, nonatomic) IBOutlet UITextField *personName;

@property (weak, nonatomic) IBOutlet UITextField *personEmail;

@property (weak, nonatomic) 
    IBOutlet UISwitch *privacy;

@property (weak, nonatomic) IBOutlet UISwitch *wantHelp;

- (IBAction)helpToggle:(id)sender;

@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UILabel *emailLabel;

@property (weak, nonatomic) IBOutlet 
UIButton *test;

@конец

и вот мои.m декларации:

#import "PlanBusinessController.h"

@interface PlanBusinessController ()

@end

@implementation PlanBusinessController
@synthesize nameLabel;
@synthesize emailLabel;
@synthesize businessDescription;
@synthesize buttonProperty;
@synthesize personName;
@synthesize personEmail;
@synthesize privacy;
@synthesize wantHelp;
@synthesize test;


-(void)touchesBegan:(NSSet*)touches
{
    UITouch *touch=[touches anyObject];
    UIView *view=touch.view;
    if (![view isEqual:businessDescription])
    {
        //[businessDescription resignFirstReponder];
    }
}

- (IBAction)backgroundTouch:(id)sender 
{
    [businessDescription resignFirstResponder];
    [self.view endEditing:YES]; 
}

Спасибо!

3 ответа

Решение

Я использую этот метод в моей программе ViewController, и он отлично работает. Я бы попробовал.

//Used with the text fields to dismiss keyboard
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [textField resignFirstResponder];
}

Если у вас есть другие элементы, то в методы для этих элементов также добавьте [textField resignFirstResponder],

Например, если они могут нажать на кнопку, напишите что-то вроде этого:

-(IBAction)button1:(id)sender
{   
    [textField resignFirstResponder];

     //Do stuff
}

Примечание. Он нужен для каждого текстового поля, которое вы хотите закрыть. Например:

-(IBAction)button1:(id)sender
{   
    [textField resignFirstResponder];
    [textField2 resignFirstResponder];
    []... etc

     //Do stuff
}

Пожалуйста, проверьте код ниже:

-(void)touchesBegan:(NSSet*)touches
 {
    UITouch *touch = [touches anyObject];
    UIView *textView=touch.view;
    if (![textView isKindOfClass:[UITextView class]])
    {
        [businessDescription resignFirstResponder];
    }
 }

Когда вы прикасаетесь к объекту, он проверяет, является ли UITextView или нет, если не закончится редактирование.

Легким способом было бы поймать вид, на котором произошло касание. И сравните это с текстовой областью. Если вид или (что-то вроде кнопки) отличается от текстовой области, вы можете скрыть клавиатуру. Вот псевдокод:

 -(void)touchesBegan:(NSSet*)touches
 {
    UITouch *touch=[touches anyObject];
    UIView *view=touch.view;
       if (![view isEqual:textArea])
        [textarea resignFirstReponder];
 }
Другие вопросы по тегам