0

UITextFieldDelegate 协议在 iOS 4.3 和 iOS 5.0 之间的工作方式似乎是未记录的更改,这些更改破坏了我的代码。

简单重现如下:使用 XCode 4.2,创建一个名为 test 的“单一视图应用程序”项目。使用默认选项(即没有 Storyboard,但对 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 时,您会自动转到字段 (i+1)。关于出了什么问题以及如何解决问题的任何建议?我在 Apple 的 iOS 5 发行说明中看不到任何提及。

4

2 回答 2

0

我怀疑这textFieldDidEndEditing:被调用了两次。

一次当您选择 textField2(结束 textField1 中的编辑),然后当您再次调用时[textField2 becomeFirstResponder];:因为 textField2 当您告诉它再次成为 firstResponder 时,它已经是 firstResponder(因为您触摸它是为了结束对 textField1 的编辑) ,它实际上放弃了它的 firstResponder 状态(调用textFieldDidEndEditing),然后再次成为 firstResponder 。

尝试将此更改[textField2 becomeFirstResponder];为:

 if (![textField2 isFirstResponder]) {
      [textField2 becomeFirstResponder];
 }  
于 2012-01-04T23:37:12.157 回答
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";

    }
}

这将起作用,它会通过点击返回自动切换第一响应者。

于 2012-01-05T02:47:26.210 回答