2014-09-18 2 views
2

Я пишу приложение для iPhone, в котором мне нужен пользовательский класс UITextField. Для моих текстовых полей мне нужен отступ, изображение внутри перед текстом и максимальными символами. По этой причине я создал собственный класс на основе UITextField. Все мои текстовые поля будут основаны на этом новом классе. Я использую Google и обыскаю Stackoverflow, и я обнаружил, что в таких случаях, как мой, мне нужно использовать self.delegate = self; во время init, поэтому мне не нужно реализовывать такие методы, как textFieldShouldBeginEditing или textFieldShouldEndEditing внутри класса View Controller. Все мои текстовые поля будут созданы в раскадровке, так что initWithCoder. В результате я получаю бесконечный цикл и крах приложения (я использую симулятор в этот момент) после ввода 1, 2 или 3 символа. Интересно, что для цифровой клавиатуры или клавиатуры для пароля такой проблемы нет. Также, если я набираю символы на моей клавиатуре Mac вместо симулятора, нет проблем. Я пытался отлаживать, но во время сбоя он перескакивает прямо в цикл и существует с ошибкой. Как преодолеть эту проблему?Пользовательский делегат UITextField, установленный для самостоятельной инициализации бесконечного цикла

P.S. Я спросил question, когда получаю бесконечный цикл, и были комментарии, которые self.delegate = self; может вызвать такой цикл, но я вижу, что это утверждение широко используется. Возможно, я сделал это неправильно, но я не могу понять, как сделать многоразовый класс из UITextField.

EDIT: Вот мой код:

На Инти я инициализировать и установить цвет границы:

- (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; 
} 
+0

Можете ли вы разместить свои методы textFieldShouldBeginEditing и textFieldShouldEndEditing здесь? – F1ank3r

+0

Удалось ли вам это решить? Я не вижу ничего очевидного. Попытайтесь выяснить, какая строка вашего кода вызывает бесконечный цикл. – F1ank3r

+0

Нет, это вообще. Когда я отлаживаю и пропускаю 1 или 2 символа в текстовом поле, он запускает бесконечный цикл и сбой. – new2ios

ответ

0

Я не знаю, если это может быть фактическим ответ, но у меня есть работа, вокруг которого является ответом моего следующего вопроса How properly subclass UITextField in iOS? (от justafinger). Я не выполняю назначение self.delegate = self; в своем настраиваемом элементе управления, но у меня есть методы, которые вызываются из делегатов в контроллер.

Надеюсь, это поможет людям с проблемами, такими как мои.

Смежные вопросы