Вот довольно чистый способ завершить издание ключом возврата или касанием на заднем плане.
В Интерфейсном Разработчике вставьте свои поля в представление класса UIFormView
Что означает этот класс:
- Автоматически присоединять себя как делегат полей (либо пробуждаемый от пера, либо добавленный вручную)
- Сохранить ссылку на текущее редактируемое поле
- Отключить клавиатуру при возврате или коснуться в фоновом режиме
Вот код:
Интерфейс
#import <UIKit/UIKit.h>
@interface UIFormView : UIView<UITextFieldDelegate>
-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;
@end
Осуществление
#import "UIFormView.h"
@implementation UIFormView
{
UITextField* currentEditingTextField;
}
// Automatically register fields
-(void)addSubview:(UIView *)view
{
[super addSubview:view];
if ([view isKindOfClass:[UITextField class]]) {
if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
}
}
// UITextField Protocol
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
currentEditingTextField = textField;
}
-(void)textFieldDidEndEditing:(UITextField *)textField
{
currentEditingTextField = NULL;
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self endEdit];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
if ([self textFieldValueIsValid:textField]) {
[self endEdit];
return YES;
} else {
return NO;
}
}
// Own functions
-(void)endEdit
{
if (currentEditingTextField) {
[currentEditingTextField endEditing:YES];
currentEditingTextField = NULL;
}
}
// Override this in your subclass to handle eventual values that may prevent validation.
-(BOOL)textFieldValueIsValid:(UITextField*)textField
{
return YES;
}
@end
Путем создания подкласса формы и переопределения
textFieldValueIsValid:
метод, вы
можно избежать конца издания, если значение не является правильным для данного
поле.
Если поле имеет делегата, установленного в Интерфейсном Разработчике, то форма не меняет его. Я не вижу много причин назначать другого делегата для определенного поля, но почему бы и нет ...
Есть много способов улучшить этот класс представления формы - присоединить делегат, сделать макет, обработать, когда клавиатура покрывает поле (используя фрейм currentEditingTextField), автоматически запустить редактирование для следующего поля, ...
Лично я держу его в своей структуре и всегда делю на подклассы для добавления функций, это довольно часто полезно "как есть".
Надеюсь, это поможет. Ура все