Ответ 1
[textField reloadInputViews]
кажется, делает трюк...
Как изменить ключ возврата на iPhone во время его редактирования. Я знаю о
myTextField.returnKeyType = UIReturnKeySearch;
Однако это работает только в том случае, если я вызываю [myTextField resignFirstResponder];
, а затем [myTextField becomeFirstResponder];
, который скрывает клавиатуру и возвращает ее обратно. В противном случае, это просто остается тем, что я имел раньше, в этом случае это было "Go". Мне нужно продолжать переключать их в зависимости от символов, которые вводит пользователь.
В одной строке: Как изменить тип клавиши возврата на клавиатуре во время ее редактирования?
[textField reloadInputViews]
кажется, делает трюк...
Я нашел это некоторое время назад, забыл написать здесь. Я использую:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:
(NSRange)range replacementString:(NSString *)string {
[self performSelector:@selector(addressBarTextDidChange:) withObject:nil afterDelay:0.1];
return YES;
}
-(void)addressBarTextDidChange:(NSString *)text {
NSString *addressText = @"..."; //Wherever you get your text from...
if ([addressText isEqualToString:@""]==NO) {
if ([addressText rangeOfString:@" "].location != NSNotFound) {
//[addressBarTextField setReturnKeyType:UIReturnKeySearch];
if (addressBarTextField.returnKeyType!=UIReturnKeySearch) {
[UIView beginAnimations:nil context:NULL]; //Setup the animation.
[UIView setAnimationDuration:0.0]; //The duration for the animation.
[addressBarTextField resignFirstResponder];
addressBarTextField.returnKeyType = UIReturnKeySearch;
[addressBarTextField becomeFirstResponder];
[UIView commitAnimations];
}
} else {
//[addressBarTextField setReturnKeyType:UIReturnKeyGo];
if (addressBarTextField.returnKeyType!=UIReturnKeyGo) {
[UIView beginAnimations:nil context:NULL]; //Setup the animation.
[UIView setAnimationDuration:0.0]; //The duration for the animation.
[addressBarTextField resignFirstResponder];
addressBarTextField.returnKeyType = UIReturnKeyGo;
[addressBarTextField becomeFirstResponder];
[UIView commitAnimations];
}
}
} else {
if (addressBarTextField.returnKeyType!=UIReturnKeyDone) {
[UIView beginAnimations:nil context:NULL]; //Setup the animation.
[UIView setAnimationDuration:0.0]; //The duration for the animation.
[addressBarTextField resignFirstResponder];
addressBarTextField.returnKeyType = UIReturnKeyDone;
[addressBarTextField becomeFirstResponder];
[UIView commitAnimations];
}
}
}
В принципе, я оживляю клавиатуру в течение и в течение 0,0 секунд (так что пользователь ее не увидит). Я также проверяю, не является ли клавиатура еще той, которую я хочу, перед переключением, потому что постоянное переключение вызывает задержку.
В моем случае он работал следующим образом:
sender.returnKeyType=UIReturnKeyNext;
[sender reloadInputViews];
[sender resignFirstResponder];
[sender becomeFirstResponder];
Мне пришлось форсировать risignFirstResponder, за которым следует startFirstponder.
Я создал пользовательскую категорию, чтобы открыть returnKeyType.
Просто импортируйте и делайте self.addField.returnKeyType = UIReturnKeySearch;
или все, что вы хотите установить как returnKeyType. Вы также можете использовать его динамически, когда клавиатура уже открыта. Он будет автоматически обновляться.
Вот он:
Интерфейс:
/*
Simple hack for exposing returnKeyType for UISearchBar without private APIs
For you from CodeBuffet ;)
Enjoy!
~PW
*/
#import <UIKit/UIKit.h>
@interface UISearchBar (ReturnType)
@property (nonatomic, readwrite) UIReturnKeyType returnKeyType;
@end
Реализация:
#import "UISearchBar+ReturnType.h"
@implementation UISearchBar (ReturnType)
UITextField *textField;
- (UITextField *) traverseForTextViewInViews: (NSArray*) views
{
// Traverse over all views recursively until we find the tresure TextField hidden deep the UISearchBar ocean!
for(UIView *subView in views) {
if([subView conformsToProtocol:@protocol(UITextInputTraits)]) {
return (UITextField *) subView;
}
UITextField *tv = [self traverseForTextViewInViews:subView.subviews];
if (tv) {
return tv;
}
}
return nil;
}
#pragma mark Custom Setters & Getters
- (void)setReturnKeyType:(UIReturnKeyType)returnKeyType
{
if (!textField) {
textField = [self traverseForTextViewInViews:self.subviews];
}
textField.returnKeyType = returnKeyType;
[self reloadInputViews];
[textField reloadInputViews];
}
- (UIReturnKeyType)returnKeyType
{
if (!textField) {
textField = [self traverseForTextViewInViews:self.subviews];
}
return textField.returnKeyType;
}
@end
Мне нужно было обновить returnKeyType (Next ↔ Go) на основе текущего содержимого текстового поля. Метод reloadInputViews в текстовом поле не работал после установки метода returnKeyType. Как отмечали другие плакаты, необходим resignFirstResponder, за которым следует startFirstponder. В моей ситуации, когда текстовое поле стало первымResponder и отобразило клавиатуру, оно оживило бы увольнение и повторное появление клавиатуры. На более мелких устройствах или в ландшафтном режиме это также приведет к мгновенному скачку представления, содержащего текстовое поле. Решение, которое я нашел, чтобы скрыть это нежелательное поведение, заключается в том, чтобы поместить resignFirstResponder и статьFirstResponder в блок анимации продолжительностью 0 секунд.
[UIView animateWithDuration:0.0
delay:0.0
options:0
animations:^{
[textField reloadInputViews];
[textField resignFirstResponder];
[textField becomeFirstResponder];
}
completion:nil];
Вы пытались использовать делегат TextField:
- (BOOL) textFieldShouldBeginEditing: (UITextField *) textField { textField.returnKeyType = UIReturnKeySearch; return YES; }
Я сделал это с этими тремя строками кода:
[sender setReturnKeyType:UIReturnKeyDone];
[sender resignFirstResponder];
[sender becomeFirstResponder];
Swift 3
После изменения returnKeyType
вашего вызова UITextField
или UITextView
:
textFieldOrView.resignFirstResponder()
textFieldOrView.becomeFirstResponder()
Хотя вызов textFieldOrView.reloadInputViews()
работает в некоторых случаях, он не так безопасен, как решение выше.