似乎是UITextFieldDelegate协议如何在iOS 4.3和iOS 5.0之间工作的未记录的更改,这些更改破坏了我的代码。
简单重现如下: 使用XCode 4.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
在模拟器中运行代码,它会显示两个白色的UITextField。点击第一个,然后点击第二个。
如果在模拟器上的iOS 4.3中运行,UILabel会显示“已完成编辑第一个框” 如果在模拟器上的iOS 5.0中运行,UILabel将显示“完成编辑第二个框”
我试图让它成为当你离开田野时我会自动去田野(i + 1)。关于什么是错的任何建议,以及如何解决它?我在Apple的iOS 5发行说明中看不出任何提及。
答案 0 :(得分:0)
我怀疑textFieldDidEndEditing:
被调用了两次。
一旦你选择textField2(它结束了textField1中的编辑),然后再次调用[textField2 becomeFirstResponder];
时:因为textField2它已经是firstResponder(因为你触摸它以便结束textField1上的编辑)你告诉它再次成为第一个响应者,它实际上会重新启动它的firstResponder状态(调用textFieldDidEndEditing
)然后再次成为第一个响应者。
尝试将[textField2 becomeFirstResponder];
更改为:
if (![textField2 isFirstResponder]) {
[textField2 becomeFirstResponder];
}
答案 1 :(得分:0)
通过触摸第二个框,它会自动成为第一个响应者,因此设置它是两次。
-(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";
}
}
这将有效,它将通过点击返回自动切换第一响应者。