Простой способ уволить клавиатуру?

Если вы запустите сайт на основе контента (например, YouTube), просто напишите небольшой скрипт, который читает вашу базу данных и генерирует XML-файл для каждого URL-адреса.

Поместите его как задание cron после каждого день / неделю. Вы также можете пинговать Google / Yahoo / MSN и т. Д., Когда ваша карта сайта обновляется, чтобы они могли выбрать новую карту сайта и индексировать новые URL.

374
задан James Webster 7 August 2015 в 13:48
поделиться

30 ответов

Попробуйте:

[self.view endEditing:YES];
790
ответ дан Iulian Onofrei 7 August 2015 в 13:48
поделиться

Вы должны использовать один из этих методов,

[self.view endEditing:YES];

или

[self.textField resignFirstResponder];
0
ответ дан Federico klez Culloca 7 August 2015 в 13:48
поделиться

проще всего назвать метод

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    if(![txtfld resignFirstResponder])
    {
        [txtfld resignFirstResponder];
    }
    else
    {

    }
    [super touchesBegan:touches withEvent:event];
}
0
ответ дан P.J.Radadiya 7 August 2015 в 13:48
поделиться

В быстром:

self.view.endEditing(true)
0
ответ дан YannSteph 7 August 2015 в 13:48
поделиться

Да, endEditing - лучший вариант. А в iOW 7.0 UIScrollView есть классная функция, позволяющая отключить клавиатуру при взаимодействии с видом прокрутки. Для достижения этого вы можете установить keyboardDismissMode свойство UIScrollView.

Установите режим отклонения клавиатуры следующим образом:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

Он имеет несколько других типов. Взгляните на этот яблочный документ .

0
ответ дан Shanmugaraja G 7 August 2015 в 13:48
поделиться

Добавьте к своему представлению A Recognizer Gesture Recognizer. И определите его ibaction

Ваш файл .m будет похож на

    - (IBAction)hideKeyboardGesture:(id)sender {
    NSArray *windows = [UIApplication sharedApplication].windows;
    for(UIWindow *window in windows) [window endEditing:true];
    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

Он работает для меня

0
ответ дан Murat KAYA 7 August 2015 в 13:48
поделиться

И быстро мы можем сделать

UIApplication.sharedApplication().sendAction("resignFirstResponder", to: nil, from: nil, forEvent: nil)
1
ответ дан Eike 7 August 2015 в 13:48
поделиться

Несколько более надежный метод, который мне нужно было использовать недавно:

- (void) dismissKeyboard {
    NSArray *windows = [UIApplication sharedApplication].windows;

    for(UIWindow *window in windows) [window endEditing:true];

    //  Or if you're only working with one UIWindow:

    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

Я обнаружил, что некоторые другие «глобальные» методы не работают (например, UIWebView и WKWebView отказались в отставку).

0
ответ дан mattsven 7 August 2015 в 13:48
поделиться

В Swift 3 вы можете сделать следующее

UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
2
ответ дан KeithC 7 August 2015 в 13:48
поделиться

Вы должны отправить endEditing: в рабочее окно, являющееся подклассом UIView

[[UIApplication sharedApplication].windows.firstObject endEditing:NO];
2
ответ дан malex 7 August 2015 в 13:48
поделиться

Даже проще, чем ответ Мигар

перезаписать touchesBegan:withEvent:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [textField resignFirstResponder];`
}

Это будет dismiss the keyboard при касании в любом месте в background.

4
ответ дан P.J.Radadiya 7 August 2015 в 13:48
поделиться

Это не красиво, но то, как я отказываюсь от firstResponder, когда я не знаю, что это за ответчик:

Создайте UITextField, либо в IB, либо программно. Сделать это скрытым Свяжите это с вашим кодом, если вы сделали это в IB. Затем, когда вы хотите убрать клавиатуру, вы переключаете респондент в невидимое текстовое поле и немедленно отказываетесь от него:

  [self.invisibleField becomeFirstResponder];
  [self.invisibleField resignFirstResponder];
0
ответ дан cannyboy 7 August 2015 в 13:48
поделиться

Здесь слишком много слишком сложных ответов, возможно, потому, что это нелегко найти в документации по iOS. Джозеф H имел это прямо выше:

[[view window] endEditing:YES];
5
ответ дан Kristian Glass 7 August 2015 в 13:48
поделиться

Вам также может потребоваться переопределить UIViewController disablesAutomaticKeyboardDismissal, чтобы в некоторых случаях это работало. Это, возможно, должно быть сделано в UINavigationController, если он у вас есть.

1
ответ дан Craig Miller 7 August 2015 в 13:48
поделиться

Лучший способ отклонить клавиатуру из UITableView и UIScrollView:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag
2
ответ дан Abha 7 August 2015 в 13:48
поделиться

Вы можете рекурсивно перебирать подпредставления, сохранять массив всех полей UITextFields, а затем перебирать их и оставлять их все.

Не очень хорошее решение, особенно если у вас много подпредставлений, но для простых приложений это должно сработать.

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

Будьте изобретательны, мне понадобилось всего 10 минут, чтобы обдумать это для моего приложения после того, как я нашел этот вопрос.

0
ответ дан M. Ryan 7 August 2015 в 13:48
поделиться

Ответ Джереми для меня не совсем сработал, я думаю, потому что у меня был стек навигации в виде вкладок с модальным диалогом поверх него. Я использую следующее прямо сейчас, и оно работает для меня, но ваш пробег может отличаться.

 // dismiss keyboard (mostly macro)
[[UIApplication sharedApplication].delegate dismissKeyboard]; // call this in your to app dismiss the keybaord

// --- dismiss keyboard (in indexAppDelegate.h) (mostly macro)
- (void)dismissKeyboard;

// --- dismiss keyboard (in indexAppDelegate.m) (mostly macro)
// do this from anywhere to dismiss the keybard
- (void)dismissKeyboard {    // from: http://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard

    UITextField *tempTextField = [[UITextField alloc] initWithFrame:CGRectZero];

    UIViewController *myRootViewController = <#viewController#>; // for simple apps (INPUT: viewController is whatever your root controller is called.  Probably is a way to determine this progragrammatically)
    UIViewController *uivc;
    if (myRootViewController.navigationController != nil) { // for when there is a nav stack
        uivc = myRootViewController.navigationController;
    } else {
        uivc = myRootViewController;
    }

    if (uivc.modalViewController != nil) { // for when there is something modal
        uivc = uivc.modalViewController;
    } 

    [uivc.view  addSubview:tempTextField];

    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
    [tempTextField release];

}
1
ответ дан JJ Rohrer 7 August 2015 в 13:48
поделиться

Подклассы ваших текстовых полей ... а также текстовых представлений

В подкласс поместите этот код ..

-(void)conformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyBoard) name:KEYBOARD_DISMISS object:nil];
}

-(void)deConformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] removeObserver:self name:KEYBOARD_DISMISS object:nil];
}

- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [self resignFirstResponder];
}

В делегатах текстового поля (аналогично для делегатов текстового обзора)

-(void)textFieldDidBeginEditing:(JCPTextField *)textField{
     [textField conformsToKeyboardDismissNotification];
}


- (void)textFieldDidEndEditing:(JCPTextField *)textField{
    [textField deConformsToKeyboardDismissNotification];
}

Все готово. Теперь просто отправьте уведомление из любого места в вашем коде. Он подаст в отставку любую клавиатуру.

1
ответ дан pinckerman 7 August 2015 в 13:48
поделиться

Убери это в каком-нибудь служебном классе.

+ (void)dismissKeyboard {
    [self globalResignFirstResponder];
}

+ (void) globalResignFirstResponder {
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    for (UIView * view in [window subviews]){
        [self globalResignFirstResponderRec:view];
    }
}

+ (void) globalResignFirstResponderRec:(UIView*) view {
    if ([view respondsToSelector:@selector(resignFirstResponder)]){
        [view resignFirstResponder];
    }
    for (UIView * subview in [view subviews]){
        [self globalResignFirstResponderRec:subview];
    }
}
7
ответ дан lorean 7 August 2015 в 13:48
поделиться

Краткий совет о том, как отключить клавиатуру в iOS, когда пользователь касается любого места на экране за пределами UITextField или клавиатуры. Учитывая, сколько недвижимости может занять клавиатура iOS, имеет смысл предложить пользователям простой и интуитивно понятный способ отклонить клавиатуру.

Вот ссылка

4
ответ дан Armen 7 August 2015 в 13:48
поделиться

Чтобы отклонить клавиатуру после ее появления, есть 2 случая ,

  1. , когда UITextField находится в внутри UIScrollView

  2. , когда UITextField находится вне UIScrollView

2. когда UITextField находится вне UIScrollView, переопределите метод в ваш подкласс UIViewController

вы также должны добавить делегата для всех UITextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. В представлении прокрутки , нажатие снаружи не вызовет никакого события , поэтому в этом случае используйте Распознаватель жестов касания , перетащите UITapGesture для представления прокрутки и создайте для него IBAction .

чтобы создать IBAction, нажмите Ctrl + клик по UITapGesture и перетащите его в .h файл viewcontroller.

Здесь я назвал tappedEvent своим именем действия

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

указанная выше информация Информация была получена по следующей ссылке, пожалуйста, обратитесь за дополнительной информацией или свяжитесь со мной, если вы не понимаете данные выше .

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/

1
ответ дан 7 August 2015 в 13:48
поделиться

В заголовочном файле контроллера вашего представления добавьте <UITextFieldDelegate> к определению интерфейса вашего контроллера, чтобы он соответствовал протоколу делегата UITextField ...

@interface someViewController : UIViewController <UITextFieldDelegate>

... В файле реализации контроллера (.m) добавьте следующий метод или код внутри него, если у вас уже есть метод viewDidLoad ...

- (void)viewDidLoad
{
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTextBox.delegate = self;
}

... Затем свяжите yourTextBox с вашим фактическим текстовым полем

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField 
{
    if (theTextField == yourTextBox) {
        [theTextField resignFirstResponder];
    }
    return YES;
}
2
ответ дан C4 - Travis 7 August 2015 в 13:48
поделиться

Вот что я использую в своем коде. Это работает как шарм!

В 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];
}
3
ответ дан Takide 7 August 2015 в 13:48
поделиться

Я ненавижу, что не существует «глобального» способа программно отключить клавиатуру без использования вызовов частного API. Зачастую мне нужно программно отключать клавиатуру, не зная, какой объект является первым респондентом. Я прибег к проверке self с помощью API-интерфейса Objective-C, перечисляя все его свойства, извлекая свойства типа UITextField и отправляя им сообщение resignFirstResponder.

Это не должно быть так сложно сделать ...

0
ответ дан CIFilter 7 August 2015 в 13:48
поделиться

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

Objective-C:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

Swift 3.0:

UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)

Действия с нулевым таргетингом распространены в Mac OS X для команд меню, и вот их использование в iOS.

91
ответ дан Travelling Man 7 August 2015 в 13:48
поделиться

@Nicholas Riley & amp; @Kendall Helmstetter Geln & amp; @cannyboy:

Абсолютно великолепно!

Спасибо.

Учитывая ваши советы и советы других в этой теме, вот что я сделал:

Как это выглядит при использовании:

[[self appDelegate] dismissKeyboard]; (примечание: я добавил appDelegate в качестве дополнения к NSObject, чтобы я мог использовать его где угодно и где угодно)

Как это выглядит под капотом:

- (void)dismissKeyboard 
{
    UITextField *tempTextField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease];
    tempTextField.enabled = NO;
    [myRootViewController.view addSubview:tempTextField];
    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
}

РЕДАКТИРОВАТЬ

Поправка к моему ответу включена tempTextField.enabled = NO;. Отключение текстового поля предотвратит отправку уведомлений клавиатуры UIKeyboardWillShowNotification и UIKeyboardWillHideNotification, если вы будете полагаться на эти уведомления во всем приложении.

6
ответ дан Jeremy 7 August 2015 в 13:48
поделиться

Это решение убрать клавиатуру при нажатии return в в любом текстовом поле , добавив код в одном месте (поэтому не нужно добавлять обработчик для каждого текстового поля):


рассмотрим этот сценарий:

у меня есть viewcontroller с двумя текстовыми полями (имя пользователя и пароль). и viewcontroller реализует UITextFieldDelegate протокол

. Я делаю это в viewDidLoad

- (void)viewDidLoad 
{
    [super viewDidLoad];

    username.delegate = self;
    password.delegate = self;
}

, а viewcontroller реализует дополнительный метод как

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

и независимо от текстовое поле, в котором вы находитесь, как только я нажму return на клавиатуре, оно будет отклонено!

В вашем случае то же самое будет работать, если вы установите для всех делегатов текстового поля значение self и реализуете textFieldShouldReturn

22
ответ дан ToolmakerSteve 7 August 2015 в 13:48
поделиться

Вы можете заставить редактируемый в данный момент вид отказаться от статуса первого респондента с помощью [view endEditing:YES]. Это скрывает клавиатуру.

В отличие от -[UIResponder resignFirstResponder], -[UIView endEditing:] будет искать в подпредставлениях, чтобы найти текущего первого респондента. Таким образом, вы можете отправить его на верхний уровень представления (например, self.view в UIViewController), и он будет делать правильные вещи.

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

126
ответ дан Nicholas Riley 7 August 2015 в 13:48
поделиться

Если честно, я не в восторге от любого из предложенных здесь решений. Я нашел хороший способ использовать TapGestureRecognizer, который, я думаю, доходит до сути вашей проблемы: когда вы нажимаете на что-либо, кроме клавиатуры, отклоняйте клавиатуру.

  1. В viewDidLoad зарегистрируйтесь для получения уведомлений клавиатуры и создайте UITapGestureRecognizer:

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    
    [nc addObserver:self selector:@selector(keyboardWillShow:) name:
    UIKeyboardWillShowNotification object:nil];
    
    [nc addObserver:self selector:@selector(keyboardWillHide:) name:
    UIKeyboardWillHideNotification object:nil];
    
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
    action:@selector(didTapAnywhere:)];
    
  2. Добавьте отображение клавиатуры / скрыть респонденты. Там вы добавляете и удаляете TapGestureRecognizer в UIView, который должен отпускать клавиатуру при нажатии. Примечание. Нет необходимости добавлять его во все подэлементы или элементы управления.

    -(void) keyboardWillShow:(NSNotification *) note {
        [self.view addGestureRecognizer:tapRecognizer];
    }
    
    -(void) keyboardWillHide:(NSNotification *) note
    {
        [self.view removeGestureRecognizer:tapRecognizer];
    }
    
  3. TapGestureRecognizer вызовет вашу функцию, когда он нажмет, и вы можете отклонить клавиатуру следующим образом:

    -(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer {    
        [textField resignFirstResponder];
    }
    

Хорошая вещь о том, что это решение состоит в том, что оно фильтрует только для отводов, а не для считывания. Поэтому, если у вас есть прокрутка контента над клавиатурой, пролистывание все равно будет прокручиваться и клавиатура будет отображаться. Удалив распознаватель жестов после того, как клавиатура исчезнет, ​​будущие касания на вашем экране обрабатываются нормально.

56
ответ дан Professor Todd 7 August 2015 в 13:48
поделиться

Лучшим подходом является «украсть» статус первого респондента.

Поскольку UIApplication является подклассом UIResponder, вы можете попробовать:

[[UIApplication sharedApplication] becomeFirstResponder]
[[UIApplication sharedApplication] resignFirstResponder]

Если это не удастся, создать новый UITextField с фреймом нулевого размера, добавить его в какое-либо представление и сделать нечто подобное в отставку).

14
ответ дан Kendall Helmstetter Gelner 7 August 2015 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: