0

私のコードを壊しているiOS4.3とiOS5.0の間でUITextFieldDelegateプロトコルがどのように機能するかについての文書化されていない変更のようです。

次のように簡単に再現できます。XCode4.2を使用して、testという「シングルビューアプリケーション」プロジェクトを作成します。デフォルトのオプションを使用します(つまり、ストーリーボードはありませんが、ARCははい)展開ターゲットを4.3に設定します(5.0と4.3の両方でアプリを実行できるようにします)

このコードをViewController.hヘッダーファイルに入れます。

#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];
            resultsLabel.text=@"Finished editing 1st box";
            break;

        case 2:
            // textField2
            resultsLabel.text=@"Finished editing 2nd box";
            break;
    }
}

@end

シミュレーターでコードを実行すると、2つの白いUITextFieldが表示されます。最初のものをタップしてから、2番目のものをタップします。

シミュレーターでiOS4.3で実行した場合、UILabelは「Finishedediting1stbox」を表示します。シミュレーターでiOS5.0で実行した場合、UILabelは「Finishedediting2ndbox」を表示します。

フィールドiを離れると、自動的にフィールド(i + 1)に移動するようにしようとしています。何が悪いのか、そしてそれを修正する方法について何か提案はありますか?AppleのiOS5リリースノートには何の言及もありません。

4

2 に答える 2

0

それtextFieldDidEndEditing:は二度呼ばれているのではないかと思います。

textField2(textField1での編集を終了する)を選択したときと、呼び出したとき[textField2 becomeFirstResponder];:textField2以降、(textField1での編集を終了するためにタッチしたため)再びfirstResponderになるように指示すると、すでにfirstResponderになります。 、実際にはfirstResponderステータス(を呼び出すtextFieldDidEndEditing)を辞任してから、再びfirstResponderになります。

これをこれに変更[textField2 becomeFirstResponder];してみてください:

 if (![textField2 isFirstResponder]) {
      [textField2 becomeFirstResponder];
 }  
于 2012-01-04T23:37:12.157 に答える
0

2番目のボックスをタッチすると、自動的にファーストレスポンダーになるため、プログラムで設定すると2回設定されます。

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

        resultsLabel.text=@"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) {
        resultsLabel.text=@"Finished editing 1st box";

    }
}

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

于 2012-01-05T02:47:26.210 に答える