2012-01-04 9 views
0

私のコードを壊しているiOS 4.3とiOS 5.0の間でUITextFieldDelegateプロトコルがどのように動作するかについて、文書化されていない変更があるようです。UITextFieldDelegateプロトコルが、iOS 4.3と5.0の間で変更されました。何が起こっていますか?

単純に次のように再現してください。 XCode 4.2を使用して、testという名前の「単一ビューアプリケーション」プロジェクトを作成します。

:ViewController.hヘッダー・ファイルにこのコードを入れて

に(ので、我々は5.0と4.3の両方でアプリケーションを実行することができます)4.3に 設定デプロイメント・ターゲット(ARCにすなわちいいえストーリーボードが、はい)デフォルトのオプションを使用します

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController <UITextFieldDelegate> 

@property(nonatomic,strong) UITextField *textField1; 
@property(nonatomic,strong) UITextField *textField2; 
@property(nonatomic,strong) UILabel *resultsLabel; 

@end 

ViewController.mファイルでこれを入れて:

#import "ViewController.h" 

@implementation ViewController 

@synthesize textField1,textField2,resultsLabel; 

- (void)viewDidLoad { 
    textField1=[[UITextField alloc] initWithFrame:CGRectMake(10, 10, 300, 30)]; 
    textField1.tag=1; 
    textField1.backgroundColor=[UIColor whiteColor]; 
    textField1.delegate=self; 
    [self.view addSubview:textField1]; 

    textField2=[[UITextField alloc] initWithFrame:CGRectMake(10, 50, 300, 30)]; 
    textField2.tag=2; 
    textField2.backgroundColor=[UIColor whiteColor]; 
    textField2.delegate=self; 
    [self.view addSubview:textField2]; 

    resultsLabel=[[UILabel alloc] initWithFrame:CGRectMake(10, 90, 300, 30)]; 
    resultsLabel.backgroundColor=[UIColor clearColor]; 
    [self.view addSubview:resultsLabel]; 

    [super viewDidLoad]; 
} 

-(void)textFieldDidEndEditing:(UITextField *)textField { 
    switch (textField.tag) { 
     case 1: 
      // textField1 
      [textField2 becomeFirstResponder]; 
      [email protected]"Finished editing 1st box"; 
      break; 

     case 2: 
      // textField2 
      [email protected]"Finished editing 2nd box"; 
      break; 
    } 
} 

@end 

実行シミュレータ内のコードと、それは、二つの白いUITextFieldsを表示します。最初のものをタップし、もう1つをタップします。

シミュレータ上でのiOS 5.0でUILabelディスプレイを実行する場合、私はそれをしようとしています

「第二のボックスの編集が完了し、」 「第一ボックスの編集を終え、」UILabelディスプレイシミュレータ上でのiOS 4.3で実行している場合フィールドiを離れると自動的にフィールド(i + 1)に移動します。何が間違っているのか、それを修正する方法についての提案はありますか? AppleのiOS 5リリースノートには何の言及も見当たりません。

答えて

0

2番目のボックスのは、自動的にそれを2回設定されたので、progmaticallyそれを設定する最初の応答者になることに触れて:

がこのに[textField2 becomeFirstResponder];を変更してみてください。

-(void)textFieldDidEndEditing:(UITextField *)textField { 
    if (textField == textField2) { 

     [email protected]"Finished editing 2nd box"; 
    } 
} 
- (BOOL)textFieldShouldReturn:(UITextField *)textField{ 
    if (textField == textField1) { 
     [textField1 resignFirstResponder]; 
     [textField2 becomeFirstResponder]; 
    } 
    if (textField == textField2) { 
     [textField2 resignFirstResponder]; 
     [textField1 becomeFirstResponder]; 
    } 
    return YES; 
} 
- (void)textFieldDidBeginEditing:(UITextField *)textField{ 
     if (textField == textField2) { 
     [email protected]"Finished editing 1st box"; 

    } 
} 

これは機能し、リターンを押すと自動的にファーストレスポンダーが切り替わります。

+0

この方法には問題があります:キーボードをどうやって消したいのですか? –

+0

Thanks v much(正解として受け入れられました:-)私が書いている実際のコードはtextFieldShouldReturnにも反応しますので、field1で 'enter'をタップすると自動的にfield2に行きます - したがって、ある時点でプログラムで設定する必要があります。 iOS4.3と5.0が違うことをしているのは間違いです。あたかも4.3がtextFieldからfirstResponderを辞任したのに対し、5.0はfirstResponderを何とか辞めてしまったようです.....もう一度ありがとうございます。 – Peter

0

textFieldDidEndEditing:が2回呼び出されていると思われます。一度

あなたが[textField2 becomeFirstResponder];を呼び出すときは、もう一度(テキストフィールド1での編集を終了)のTextField2を選択して:(あなたがテキストフィールド1の編集を終了するために、それに触れているため)あなたがそれを言うときのTextField2ので、それはすでにfirstResponderです再びfirstResponderになるためには、実際にはfirstResponderのステータス(textFieldDidEndEditingを呼び出す)を辞退し、再びfirstResponderになります。

if (![textField2 isFirstResponder]) { 
     [textField2 becomeFirstResponder]; 
} 
+0

@Inafziger - 良いアイデアをありがとう。ちょうど試しましたが、残念ながらそれは何の違いもありませんでした...私はさらに微妙なテストとブレークポイントを行う必要があります... – Peter

+0

実際には、textField2はおそらくfirstResponderではありませんが、すでにキューに入っていますまだ2回呼び出されます。 [textField2 becomeFirstResponder]を削除するだけです。両方のテキストフィールドをタップすると、正常に動作しますか? – lnafziger

+0

@Inafziger - 私の(より大きい)フォームでは、キーボードの「完了」をタップしてフィールド1を終了することができますので、becomeFirstResponderを削除すると問題が戻ってきます。フィールド2にフォーカスを自動的に渡す必要があります。その中にフィールド1を残しておけば、キーボードが消えてしまいます。これは私の後ではありません。私は特に、SDKの「穀物に対して」コーディングしていると心配し、後でAppleが紹介した理由が分からないと、他の問題にぶつかることがあるため、iOS4.3とiOS5.0の違いに興味がありますこの新しい動作をiOS5.0に... ....お返事ありがとう:) – Peter

関連する問題