2011-12-09 19 views
1

各ビューでは、アプリが物理キーボード入力を処理できるようにする「KeyHandler」オブジェクトをインスタンス化します。iOS UITextField&NSTimer Oddity

オブジェクトがインスタンス化されると、最初のレスポンダとして機能する隠しtextFieldが作成されます。インスタンス化の際

次のコードが呼び出されます。

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

投票のテキストフィールドには、次のようになります。私は物理的なキーボード、self.textField.text上のuを押すと

-(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は。しかし、textFieldはブランクにならず、@ ""に設定しています。 2回目のpollTextFieldはself.textField.text == uuと呼ばれ、3回目は== uで、キーを押さなくてもuとuuの間を循環します。もう1つの奇妙な点は、pollTextFieldが最初に呼び出されたときに、selfがまだKeyHandlerのインスタンスであり、まだ同じメモリアドレスを持っていても、selfが常に正しいインスタンス変数をすべて含むことです。

編集:ここで私は、TextFieldと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テキストフィールドにブレークポイントとタイプを設定します。 は*まあそこに行く、あなたの答えがあります。 テキストフィールドが作成され、ビューに割り当てられてから解放されるため、リリース時にライフサイクルが終了します。

ビューは現在所有していますが、直接参照することはできません。

その後、テキストフィールドにタグ値を追加します。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]。

ようなので、それが見えます:pollTextFieldはしかしKeyHandler内にある

-(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

。私はtextFieldをビューのインスタンス変数にして、リリースコールを削除しました(ビューとキーハンドラの両方にtextFieldへの参照が必要です)。しかしそれは問題を解決しませんでした。 – LDK

+0

私のソリューションは機能しませんでしたか? textFieldをクラスインスタンス変数にして、それが機能しないためには、やはりあなたに何をしたのかわかるようにコードを表示しなければなりません。 – Lefteris

+0

残念ながら、それはしませんでした。週末なので、私の前に仕事のコードがないので、今週までこれを続けることはできません。 – LDK