2011-12-09 97 views
1

在每个视图中,我实例化一个“KeyHandler”对象,该对象使应用程序能够处理物理键盘输入。iOS UITextField&NSTimer Oddity

当对象被实例化时,它创建一个隐藏的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 ==ü。但是,textField不会变成空白 - 即使我将其设置为@“”。第二次pollTextField被称为self.textField.text == uu,它是第三次== u并且它在u和uu之间循环,即使我没有按任何键。另一个奇怪的是,第一次pollTextField被称为self总是包含所有正确的实例变量,下次调用它们时,即使self仍然是一个KeyHandler实例,并且仍然具有相同的内存地址。

编辑:这就是我如何创建文本框和keyhandler:

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

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

回答

1

这看起来像一个内存问题。

你是如何在代码中创建textField的? 你正确地分配它吗?

您是否尝试了分步调试并检查textField是否是pollTextField函数中的有效对象?

只设置在GDB控制台PO文本框断点和类型,看看它给你

编辑: *好,你去,你的答案是没有。 创建Textfield,分配给视图然后释放,所以它的生命周期在您释放它时结束。

视图现在拥有它,但不能直接引用它。

标签值添加到文本框,然后从tagvalue投它:

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

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

然后在你的pollTextField功能做到这一点:

的UITextField *文本框=(的UITextField *)[self.view viewWithTag :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 = @""; 
} 
+0

pollTextField是KeyHandler内虽然。我为textField创建了视图的实例变量并删除了释放调用(因此视图和keyhandler都应该有对textField的引用)。但这并没有解决问题。 – LDK

+0

我的解决方案没有工作吗?至于使textField成为一个类实例变量,并为它不工作,再次你必须告诉我们一些代码,所以我们可以知道你做了什么。 – Lefteris

+0

不幸的是,它没有。由于这是周末,我没有工作代码在我面前,所以直到本周才能继续。 – LDK