UITextFieldDelegate协议在iOS 4.3和5.0之间更改。发生了什么?

时间:2012-01-04 23:05:37

标签: objective-c ios ios5 uitextfielddelegate

似乎是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发行说明中看不出任何提及。

2 个答案:

答案 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";

    }
}

这将有效,它将通过点击返回自动切换第一响应者。