iOS UITextField и NSTimer Oddity - PullRequest
       23

iOS UITextField и NSTimer Oddity

1 голос
/ 10 декабря 2011

В каждом представлении я создаю экземпляр объекта «KeyHandler», который позволяет приложению обрабатывать ввод с физической клавиатуры.

Когда создается экземпляр объекта, он создает скрытый textField, который действует как первый респондент.

Во время создания экземпляра вызывается следующий код:

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(pollTextField:) userInfo:nil repeats: YES];

Текстовое поле опроса выглядит так:

-(void) pollTextField:(NSTimer*) timer{
  NSString * str = self.textField.text;
  NSString * lastChar;
  if (!str || [str isEqualToString:@""]) {
    //no new text
  }else{

    lastChar = [str substringFromIndex:[str length] - 1];
    [self determineAction:lastChar];
    lastChar = @"";
    str = nil;
  }
  self.textField.text = @"";
}

Когда я нажимаю u на физической клавиатуре, self.textField.text == u.Тем не менее, textField не становится пустым - даже если я установил его на @ "".Второй раз pollTextField называется self.textField.text == uu, третий раз - == u и циклически переключается между u и uu, даже если я не нажимаю никаких клавиш.Другая странность заключается в том, что при первом вызове pollTextField self всегда включаются все правильные переменные экземпляра, в следующий раз, когда он вызывается, они отсутствуют, даже если self по-прежнему является экземпляром KeyHandler и все еще имеет тот же адрес памяти.РЕДАКТИРОВАТЬ: Вот как я создаю textField и обработчик ключей:

UITextField* textField = [[UITextField alloc] init];
[self.view addSubview:textField];

keyHandler = [[KeyHandler alloc] initWithTextField:textField];
keyHandler.delegate = self;
[textField release];

1 Ответ

1 голос
/ 10 декабря 2011

Это похоже на проблему с памятью.

Как вы создаете textField в своем коде?Вы правильно распределяете его?

Вы пробовали пошаговую отладку и проверку, является ли textField действительным объектом в функции pollTextField?

просто установите точку останова и введите в консоли gdb po textFieldчтобы увидеть, что он вам дает

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

Представление теперь владеет им, но вы не можете ссылаться на него напрямую.

Добавьте значение тега в текстовое поле, затем приведите его к значению тега:

 UITextField* textField = [[UITextField alloc] init];
textField.tag = 200;
[self.view addSubview:textField];

keyHandler = [[KeyHandler alloc] initWithTextField:textField];
keyHandler.delegate = self;
[textField release];

Затем в вашей функции pollTextField сделайте следующее:

UITextField * textField = (UITextField *) [self.viewviewWithTag: 200];

Так выглядит:

-(void) pollTextField:(NSTimer*) timer{
    UITextField* textField = (UITextField*)[self.view viewWithTag:200];
    NSString * str = textField.text;
    NSString * lastChar;
    if (!str || [str isEqualToString:@""]) {
        //no new text
    }else{

        lastChar = [str substringFromIndex:[str length] - 1];
        [self determineAction:lastChar];
        lastChar = @"";
        str = nil;
    }
    textField.text = @"";
}
...