Пользовательский делегат UITextField, установленный в self, инициирует бесконечный цикл
Я пишу приложение для iPhone, в котором мне нужен пользовательский класс UITextField. Для моих текстовых полей мне нужен отступ, изображение внутри перед текстом и максимум символов. По этой причине я создал собственный класс на основе UITextField. Все мои текстовые поля будут основаны на этом новом классе. Я использую Google и искал Stackoverflow, и я обнаружил, что в таких случаях, как мой, я должен использоватьself.delegate = self;
в течениеinit
поэтому мне не нужно реализовывать такие методы, какtextFieldShouldBeginEditing
или жеtextFieldShouldEndEditing
внутри моего класса View Controller. Все мои текстовые поля будут созданы в раскадровке такinitWithCoder
, В результате я получаю бесконечный цикл и сбой приложения (в данный момент я пользуюсь симулятором) после ввода 1, 2 или 3 символов. Интересно, что для цифровой клавиатуры или клавиатуры пароля такой проблемы нет. Также, если я набираю символы на клавиатуре Mac вместо симулятора, проблем не возникает. Я попытался отладить, но во время сбоя он переходит прямо в цикл и существует с ошибкой. Как преодолеть эту проблему?
Постскриптум Я спросилвопрос когда я получаю бесконечный цикл и появляются комментарии, которыеself.delegate = self;
может вызвать такой цикл, но я вижу, что это утверждение широко используется. Может быть, я не сделал это правильно, но я не могу понять, как сделать повторно используемый класс из UITextField.
РЕДАКТИРОВАТЬ: Вот мой код:
На inti я инициализирую и устанавливаю цвет границы:
- (id)initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if (self) {
self.layer.borderColor=[[UIColor blackColor] CGColor];
self.delegate = self;
}
return self;
}
Когда я начинаю редактировать, я изменяю цвет границы и устанавливаю отступ (набор отступов будет перемещен в установщик свойств):
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
// Change border of text field that is editing to orange
textField.layer.masksToBounds=YES;
textField.layer.borderColor=[[UIColor orangeColor] CGColor];
textField.layer.borderWidth= 1.0f;
UIView *spacerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, _leftIndent, 10)];
[self setLeftViewMode:UITextFieldViewModeAlways];
[self setLeftView:spacerView];
return YES;
}
По окончании редактирования я возвращаю обратно цвет:
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
// Change border of text field that is edited to black
textField.layer.masksToBounds=YES;
textField.layer.borderColor=[[UIColor blackColor] CGColor];
textField.layer.borderWidth= 1.0f;
return YES;
}
И при изменении значения я проверяю максимум символов:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
// Restrict number of symbols in text field to "maxSymbols"
NSUInteger oldLength = [textField.text length];
NSUInteger replacementLength = [string length];
NSUInteger rangeLength = range.length;
NSUInteger newLength = oldLength - rangeLength + replacementLength;
BOOL returnKey = [string rangeOfString: @"\n"].location != NSNotFound;
return newLength <= (int)_maxSymbols || returnKey;
}