Добавление кнопки отмены на клавиатуру UITextField

Есть ли способ добавить кнопку отмены на клавиатуру, отображаемую для UITextField? Просматривая UITextInputTraits Справочник по протоколу, я ничего не смог найти, в том числе попробовать разные типы клавиатуры.


person Andrew Lauer Barinov    schedule 26.06.2012    source источник


Ответы (3)


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

http://developer.apple.com/library/ios/#documentation/uikit/reference/UITextField_Class/Reference/UITextField.html

Это пример того, что я сделал для TextView. Метод create Input Accessory View вызывается из «textViewDidBeginEditing». Затем он создает представление входных аксессуаров и в моем случае добавляет три кнопки и пробел.

Надеюсь, это поможет.

-(void)textViewDidBeginEditing:(UITextView *)textView {

[self createInputAccessoryView];
[textView setInputAccessoryView:_inputAccessoryView];
self.myTextView = textView;  }

-(void)createInputAccessoryView {

_inputAccessoryView = [[UIToolbar alloc] init];
_inputAccessoryView.barStyle = UIBarStyleBlackOpaque;
[_inputAccessoryView sizeToFit];

_inputAccessoryView.frame = CGRectMake(0,_collageView.frame.size.height - 44, _collageView.frame.size.width, 44);

UIBarButtonItem *fontItem = [[UIBarButtonItem alloc] initWithTitle:@"Font"
                                                             style:UIBarButtonItemStyleBordered
                                                            target:self action:@selector(changeFont:)];
UIBarButtonItem *removeItem = [[UIBarButtonItem alloc] initWithTitle:@"Remove"
                                                             style:UIBarButtonItemStyleBordered
                                                            target:self action:@selector(removeTextView:)];
//Use this to put space in between your toolbox buttons
UIBarButtonItem *flexItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                                                                          target:nil
                                                                          action:nil];
UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                             style:UIBarButtonItemStyleDone
                                                            target:self action:@selector(dismissKeyBoard:)];

NSArray *items = [NSArray arrayWithObjects:fontItem,removeItem,flexItem,doneItem, nil];
[_inputAccessoryView setItems:items animated:YES];
[_myTextView addSubview:_inputAccessoryView];
}
person Kevin Horgan    schedule 26.06.2012
comment
Спасибо за это, хотя, если бы вы просто делали кнопку отмены, разве размещение кнопки отмены UIBarButtonItem рядом с UITextField не привело бы к тому же самому без вспомогательного вида? - person Andrew Lauer Barinov; 26.06.2012
comment
Если подумать, я бы именно так и поступил. Это действительно хороший ответ, и он определенно решает мою проблему, поэтому я отмечу его как принятый. - person Andrew Lauer Barinov; 26.06.2012
comment
@kevinhorgan, почему вы сразу не присвоили self.myTextView свойству ввода? - person Camus; 23.06.2013

Я просто поместил UIToolbar в свой контроллер представления в Interface Builder, а затем:

@property IBOutlet UIToolbar *keyboardAccessory;

-(void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // this is so I can edit it in Interface Builder, but it doesn't show in the view
    [keyboardAccessory removeFromSuperview];
}

-(BOOL) textFieldShouldBeginEditing:(UITextField*)textField {
    textField.inputAccessoryView = keyboardAccessory;
    return YES;
}

-(IBAction) pressedCancelButton {
    [self.view endEditing:YES];
}

Вуаля!

person jab    schedule 26.07.2013

Андрей, как дела? это Дима Р!

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

typedef enum {
   UIReturnKeyDefault,
   UIReturnKeyGo,
   UIReturnKeyGoogle,
   UIReturnKeyJoin,
   UIReturnKeyNext,
   UIReturnKeyRoute,
   UIReturnKeySearch,
   UIReturnKeySend,
   UIReturnKeyYahoo,
   UIReturnKeyDone,
   UIReturnKeyEmergencyCall,
} UIReturnKeyType;

Что вы можете сделать, так это либо добавить представление поверх клавиатуры, содержащее кнопку отмены, либо попытаться пройти через иерархию представлений и таким образом наложить то, что вы хотите, на кнопку (хотя этот метод ненадежен). К сожалению, это то, для чего Apple еще не предоставила много настроек.

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

person Dima    schedule 26.06.2012
comment
Ого, какое возвращение, приятно видеть тебя здесь, чувак. И спасибо за ответ. Да, я хотел бы дать пользователю дополнительную кнопку отмены на случай, если он захочет отменить ввод текста. - person Andrew Lauer Barinov; 26.06.2012
comment
Ответ Кевина Хоргана - тот, который вам нужен, это правильный способ добиться этого. - person Dima; 26.06.2012