私のコードを壊している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リリースノートには何の言及もありません。