2012-01-04 78 views
0

似乎是无证如何UITextFieldDelegate协议的iOS 4.3和iOS 5.0被打破我的代码之间的工作变动。UITextFieldDelegate协议在iOS 4.3和5.0之间更改。发生了什么?

简单重现如下: 使用的XCode 4.2,创建一个“单一视图的应用”项目称为测试。使用默认选项(即没有故事板,但肯定的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]; 
      [email protected]"Finished editing 1st box"; 
      break; 

     case 2: 
      // textField2 
      [email protected]"Finished editing 2nd box"; 
      break; 
    } 
} 

@end 

运行在模拟器上的代码,并显示两个白色UITextFields。点击第一个,然后点击第二个。

如果在模拟器中的UILabel显示“编辑完第一个盒子” 运行的iOS 4.3。如果在安装iOS 5.0模拟器上运行的UILabel显示“编辑完成第2盒”

我试图让它如此当你离开现场时,你会自动去场(i + 1)。有什么不对的建议,以及如何解决它?我在Apple iOS 5发行说明中看不到任何提及。

回答

0

通过触摸第二个框其自动成为第一个响应者,以便将其设置progmatically是设置了两次。

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

     [email protected]"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) { 
     [email protected]"Finished editing 1st box"; 

    } 
} 

这将工作,它会击中回自动切换第一个响应者。

+0

这种方法有一个问题:你想如何解散键盘? – 2012-01-05 02:57:10

+0

非常感谢(接受为正确答案:-)我正在编写的实际代码也会响应textFieldShouldReturn,因此如果您在field1上点击'enter',您将自动转到field2 - 因此需要以编程方式将其设置在某个点上。奇怪的是,iOS4.3和5.0以不同的方式做到这一点 - 我猜想某种无证的功能。就好像4.3会从textField中放弃firstResponder,而5.0只是将firstResponder从无论什么情况下辞职.....再次感谢。 – Peter 2012-01-05 12:36:16

0

我怀疑textFieldDidEndEditing:被称为两次。

一旦当你选择文字栏(从而结束在textField1的编辑),然后再当你调用[textField2 becomeFirstResponder];:由于文字栏它已经是firstResponder当你告诉它(因为你为了结束对textField1的编辑感动呢)要再次成为第一个响应者,它实际上会辞去它的firstResponder状态(调用textFieldDidEndEditing),然后再次成为第一个响应者。

试试这个改变[textField2 becomeFirstResponder];这样:

if (![textField2 isFirstResponder]) { 
     [textField2 becomeFirstResponder]; 
} 
+0

@Inafziger - 感谢您的好主意。刚刚尝试过,但不幸的是它没有任何区别...我将不得不做一些更微妙的测试和突破... – Peter 2012-01-05 01:15:18

+0

其实,textField2可能不是firstResponder是,但它已经在队列中了所以仍然会被召唤两次。如果你只是删除[textField2 becomeFirstResponder];总而言之,当你点击第二个文本字段时,它能正常工作吗? – lnafziger 2012-01-05 05:10:52

+0

@Inafziger - 问题就来了回来,如果我删除becomesFirstResponder因为在我的(大)的形式,您可以通过点击“完成”的键盘,这也应该自动如果我没有通过重点领域2.退出场1有在那里,然后离开领域1只是驳回键盘,这不是我所追求的。我特别感兴趣的是为什么iOS4.3和iOS5.0之间的区别,因为我担心自己编码对SDK的“不利”,如果我不明白为什么苹果已经推出了,它会在以后遇到其他问题这种新的行为到iOS5.0 ....感谢您的回答:) – Peter 2012-01-06 07:37:19

相关问题